2011-04-28 61 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();