使用LINQ按预定义的一组键进行分组

时间:2013-12-24 13:06:12

标签: c# .net linq

我使用LINQ遇到了以下问题。假设我有一组数字,范围从1到5:[1,2,4,5,0,3,1 ...]。该阵列中可能有任意数量的那些。我想要的是将该数组转换为以下结构:[{number:0, count:5},{number:1, count:3}, {number:2, count:0}....]。如果我使用GroupBy,我会错过第2号的条目。使用LINQ是否有任何优雅有效的方法?

3 个答案:

答案 0 :(得分:2)

您需要先在集合和包含数字0到5的“固定”集合之间执行外部联接。然后将其分组并进行计数。

答案 1 :(得分:0)

var arrayOfNumbers = new int[] {1, 5, 4, 5, 1, 0, 2, 3, 4, 5, 1,1,1};
 var result =
   from n in arrayOfNumbers
   group n by n into g
   select new { Number = g.Key, Count = g.Count() };

 foreach (var item in result)
 {
    Console.WriteLine(String.Format("Number {0}: count {1}", item.Number, item.Count));
 }

答案 2 :(得分:0)

List<KeyValuePair<string, int>> pairs = new List<KeyValuePair<string,int>>();

for(int i = 0; i < 5; i++)            
{
    pairs.Add(new KeyValuePair<string, int>("number:" + i, arrayOfNums.Select(x => x == i).Count()));
}

arrayOfNums是0到5之间的值数组。 结果以您希望的格式存储在List<KeyValuePair>>中。

您可以改进这一点,而不是在循环中使用硬编码的5,您可以使用查找数组中的最高值。