【问题标题】:Is there a built-in way to do an Intersect on a List of Lists using LINQ?是否有一种内置方法可以使用 LINQ 对列表列表进行相交?
【发布时间】:2020-12-06 08:03:46
【问题描述】:

假设我有

{ { "a", "b", "c" }, { "d", "b", "c" }, { "z", "a", "c" } }

我可以遍历外部列表并在每个内部列表上进行相交并得到:

{ "a", "b", "c", "d", "z" }

但是,我想知道 .NET 中是否有内置的东西可以做到这一点。我觉得应该有一种方法可以做类似的事情:

listOfLists.Intersect();

通常,您会在其中放置另一个列表以使两个列表相交,但似乎应该有一种方法可以在 LINQ 中执行此操作。

我确实为了自己的目的做了一个超载,但我想知道我是否不需要。

    internal static string Intersect(this IEnumerable<string> inputs)
    {
        var temp = inputs.FirstOrDefault().ToCharArray();
        foreach (var item in inputs.Skip(1))
        {
            temp = temp.Intersect(item).ToArray();
        }
        return new string(temp);
    }

【问题讨论】:

  • 你的样本是错误的 - 如果你正在做一个交叉路口,你应该只得到c。你说的是联合吗?在这里试图找到什么,常见的字母,独特的字母?请注意,这只适用于 ASCII 文本。

标签: c# linq


【解决方案1】:

您可以使用Aggregate LINQ 运算符。

internal static string Intersect(this IEnumerable<string> inputs) =>
    string.Join("", inputs.Select(x => x.AsEnumerable()).Aggregate((x, y) => x.Union(y)));

请注意,您显示的预期结果是三个字符串中所有字母的Union,而不是Intersect。但是,如果您实际上是指相交,则只需使用 x.Intersect(y)

【讨论】:

  • 会比 .SelectMany(l => l, (list,item) => item).Distinct() 提供更好的性能吗?
  • 是的,当我最初写这个问题时,我询问了 intersect union except 和 concat。为了清楚起见,我将其清理为仅一个,但没有留下正确的示例。谢谢。
猜你喜欢
  • 2023-01-27
  • 2012-09-27
  • 1970-01-01
  • 2013-03-08
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多