2011-04-28 64 views
2

我已經填充有數據的Dictionary<K,V>對象:如何獲取在C#中字典<K,V>中打包值的數組大小?

Dictionary<string, double[]> ltableData; 

每個double[]具有相同的大小(元素的數量)。

我不知道事先沒有任何「字符串」鍵,也不是在「雙[]」值的大小。

現在我必須做出一個週期,一個嵌套一個如下:

for(int i = 0; i< number_elements;i++) 
{ 
    foreach (var array in ltableData.Values) 
    { 
     ltempList.Add(array[i]); 
     //other instructions 
    } 
} 

我如何分配number_elements?我當然可以使用這個解決方案:

var lrowCount; 
foreach(var item in ltableData.Values) 
{ 
    lrowCount = item.Count(); 
} 

它的作品,但它當然是醜陋的看到和執行。有沒有更清潔和更有效的方法來提取計數?由於

弗朗西斯

+1

你的第一個嵌套的循環沒有意義的總數 - 什麼是你想怎麼辦?在第二個循環中,您只需重新分配相同的值 - 也沒有任何意義。 – BrokenGlass 2011-04-28 13:33:18

+0

的確,不會'Dictionary .Add'帶一個'(string,double [])'對嗎?你正試圖將它傳遞給一個'double'。 – Domenic 2011-04-28 13:44:06

+0

@BrokenGlass:對不起,這是一個錯字,現在它是正確的 – CiccioMiami 2011-04-28 13:46:20

回答

6
var lrowCount = ltableData.Values.First().Length; 
// or 
var lrowCount = ltableData.First().Value.Length; 
+0

絕對是我在找的!謝謝 – CiccioMiami 2011-04-28 14:46:28

+0

@Francesco:這是一個非常迂迴的方式來完成你想要的(手動找到長度,然後手動做兩個嵌套循環)。查看我的答案,瞭解使用單個內置方法的解決方案。 – Domenic 2011-04-28 16:07:42

3

你可以把它的長度從任何項目:

int number_elements = ltableData.Values.Select(v => v.Length).FirstOrDefault(); 

但我認爲,如果你有這樣的結構,那麼你應該爲它創建一個類,將在頂層有一個Length並且還將斷言並保證所有內部物品具有相同的長度。

+1

應該首先執行任何元素的檢查,否則此代碼可能會拋出。 OP需要考慮這種情況下的長度。 – spender 2011-04-28 13:34:50

3
foreach (var array in ltableData.Values) 
{ 
    for (int i = 0; i < array.Length; i++) 
    { 
     //other instructions 
    } 
} 

,或者甚至更易讀,

foreach (var array in ltableData.Values) 
{ 
    foreach (var val in array) 
    { 
     //other instructions 
    } 
} 
+0

不回答問題,即如何提取計數 – Domenic 2011-04-28 13:34:49

+0

@Domenic:不,但我相信它解決了潛在的問題並使問題變得多餘。 – Timwi 2011-04-28 13:38:40

+0

我相信它會拋出一個異常,因爲你在遍歷它時更新'ltableData'。 – Snowbear 2011-04-28 13:40:44

2

如果你知道itableData確實包含值,你可以做到以下幾點。

ltableData.Values.First().Count(); 
1

我不會說這是乾淨多了,但你可以做

var number_elements = ltableData.Values.First().Count(); 

這只是如果你必須需要的長度。否則,foreach循環將會很好。

1

現在你已經明確你在做什麼,按您的原始文章的評論,很顯然,你真正想要

using System.Linq; 

var ltempList = ltableData.SelectMany(kvp => kvp.Value); 

這會給包含IEnumerable<double>所有的值從各個不同的詞典中的條目彙總在一起。

+0

轉換爲感謝您的答案。不過,我只需要一個價值。存儲在字典中的數組值具有完全相同的大小。一旦我獲得了一個陣列的大小,作業就完成了。你的表情做了一個不同的工作 – CiccioMiami 2011-04-29 08:07:20

+0

@Francesco:好的,那你爲什麼在你的問題中包含這兩個嵌套for循環?我的代碼取代了它們,沒有獲得尺寸的中間步驟。 – Domenic 2011-04-29 14:14:17

+0

我正在填充ViewModel,其中字典的鍵是表標題,值表示每個標題的列。爲了使用foreach或擴展的html助手,我需要轉換值 – CiccioMiami 2011-04-29 14:27:34

1

你可以用它來獲取值

var number_elements = ltableData.Select(p => p.Value.Count()).Sum();