Linq的特别分组

时间:2015-02-16 10:18:11

标签: .net json

我不太确定如何解释这个问题

我有一些事情:

 0     1    A

 2     3    A

 1     1    A

 0     1    B

 2     5    B

我想要这样的一套:

A,[{0,1},{2,3},{1,1}]

B,[{0,1},{2,5}]

1 个答案:

答案 0 :(得分:0)

您尚未提供有关数据结构的任何信息,因此我将在此处使用元组。要实现您的目标,您可以使用LINQ ToLookup

var data = new[] {
  Tuple.Create(0, 1, "A"),
  Tuple.Create(2, 3, "A"),
  Tuple.Create(1, 1, "A"),
  Tuple.Create(0, 1, "B"),
  Tuple.Create(2, 5, "B")
};
var result = data.ToLookup(
  tuple => tuple.Item3,
  tuple => Tuple.Create(tuple.Item1, tuple.Item2)
);

您可以打印查找表:

foreach (var grouping in result)
  Console.WriteLine(
    "{0}: {1}",
    grouping.Key,
    String.Join(", ", grouping.Select(tuple => tuple.ToString()))
  );

输出结果为:

A: (0, 1), (2, 3), (1, 1)
B: (0, 1), (2, 5)

您可以使用GroupBy而不是ToLookup。不同之处在于,一旦计算出查找表,它就存储在内存中。如果您使用GroupBy,则每次使用foreach迭代结果时都会执行分组。此外,如果您的数据源自支持LINQ的数据源(如实体框架),则使用GroupBy允许在服务器端执行分组,这可能会提高性能。