【问题标题】:LINQ, Grouping on IEnumerable<object[]>LINQ,在 IEnumerable<object[]> 上分组
【发布时间】:2011-08-05 23:45:51
【问题描述】:

我有以下元素(可能不止两个):

new[] { new[] { "A" }, new[] { "B", "C" } }
new[] { new[] { "D" }, new[] { "E", "F" } }

我想将它们分组如下:

“A”、“D”

“B”、“C”、“E”、“F”

什么是最优化的方式(或者至少是好的方式)?

是否有可能以某种方式存储第一对“D”(以及第二对 E”和“F”)在开始时不在同一个数组中?

【问题讨论】:

  • 您希望如何准确分组?您的问题标题似乎与您的问题正文不符。看起来您希望将第一个项目放入一个集合中,将第二个项目放入另一个集合中。
  • IEnumerable&lt;object[]&gt; 到底是什么?您向我们展示的内容是 IEnumerable 的内容吗?这两个是IEnumerable&lt;object[]&gt;s 的独立实例吗?你能不能一下子澄清这个问题,而不是让我要求澄清。
  • 是的,这是两个独立实例的内容。我正在挠头想找到一种方法将它们分组{“A”,“D”}和{“B”,“C”,“E”,“F”}但是,分组后我会丢失以下信息第一个实例是“B”,“C”,第二个实例是“E”,“F”。 (..但是,此时即使是简单的小组也可以为我工作!)提前谢谢你!

标签: linq group-by ienumerable linq-to-objects grouping


【解决方案1】:

我昨天刚碰到这个。不是最易读的,但它实现了目标。

new [] { 
    new[] { new[] { "A" }, new[] { "B", "C" } },
    new[] { new[] { "D" }, new[] { "E", "F" } }
}.SelectMany((x, arrayPos) => x.Select((y, itemPos) => new { y, arrayPos, itemPos }))
    .GroupBy(x => new { x.itemPos })
.Select(x => x.SelectMany(y => y.y.Select(z => new { z, y.arrayPos })))

arrayPos 值将指示原始位置。

【讨论】:

  • 尝试一下。需要一段时间。
  • 有效! :) 我不知道这是否是最佳方式,我研究了在 LINQPad 上生成的 IL。谢谢! :)
  • @Nikos,在这种情况下,生成的 IL 不会告诉你太多。您将看到大部分对扩展方法的调用,而它们的实现对性能很重要。
  • 是的,确实!但是,如果在短时间内多次调用,您可能会看到生成了多少新类(增加了 GC 压力)。
【解决方案2】:

假设你在一个集合中有两个:

var collections = new[]
{
    new[] { new[] { "A" }, new[] { "B", "C" } },
    new[] { new[] { "D" }, new[] { "E", "F" } }
};

var result = from first in collections
             from second in first.Select((x, i) => new {x, i})
             from third in second.x
             group third by second.i;

结果是IEnumerable&lt;IGrouping&lt;int, string&gt;&gt;,这意味着每个成员都是strings 的集合,它还有一个int 键。请注意,结果可能没有排序,因此 1 的组可能会排在第一位。如果您不想这样,请将orderby 添加到查询的末尾。

【讨论】:

  • 这是一个不错的解决方案,但可能不止两个集合。
  • 尝试一下。需要一段时间。
  • @svick - 不错的解决方案。变量firstsecondthird 的使用让我很兴奋。当我分别用xsxix 替换它们时,对我来说更有意义。我还会在您的解决方案开始时删除“假设您在一个集合中有两个”,因为它适用于任何IEnumerable&lt;IEnumerable&lt;&gt;&gt;。如果这没有被标记为答案,我会惊呆的。
  • @Enigmativity,我想过变量名,但想不出任何好名字。我同意我现在所拥有的令人困惑,但你的名字对我来说也是如此。通过收集,我的意思是IE&lt;IE&lt;IE&lt;T&gt;&gt;&gt;,从那个问题中并不清楚这就是 OP 所拥有的。
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多