【问题标题】:C# find a number common to two or more lists [duplicate]C#查找两个或多个列表共有的数字[重复]
【发布时间】:2015-05-07 21:48:59
【问题描述】:

查找同时存在于两个或多个列表中的数字列表的语法是什么?当我只需要检查两个列表时,我正在循环,但现在我需要做几个...... 像

List<int> commonIds = SELECT id from list1 
                     where list1.contains(id), 
                           list2.contains(id), 
                           list3.contains(id) ... 

【问题讨论】:

  • 所有列表还是任意两个列表?
  • 您好,有解决办法:stackoverflow.com/questions/1674742/…
  • @Yuval “两个或多个列表”,而不是“所有列表”
  • 你的意思是所有两个集合组合的交集的并集吗?
  • @YuvalItzchakov 从标题中我倾向于“出现在这三个列表中的两个或多个列表中”,但老实说我现在不能确定。

标签: c# linq


【解决方案1】:

查找任意数量列表的交集

如果您想查找列表中所有中存在的一组数字,那么Enumerable.Intersect 是一个很好的方法。您甚至不必对列表集合进行硬编码,它可以在运行时创建:

var lists = new[] { list1, list2, ..., listN }; // dynamically specified

var common = lists.First().AsEnumerable();
foreach (var list in lists.Skip(1))
{
    common = common.Intersect(list);
}

// and now common has the result, e.g.
var listOfCommonEntries = common.ToList();

找到主列表和彼此之间的交集并集

如果你想找到包含列表1和列表2之间所有公共数字的集合,合并列表1和列表N之间的所有公共数字,那么它有些不同:

var common = Enumerable.Empty<int>();
foreach (var list in lists.Skip(1))
{
    common = common.Union(lists.First().Intersect(list));
}

【讨论】:

  • 不需要2个组合的所有交集的并集吗?
  • @Jodrell:问得好。最初我认为不是(另外,您可能是指“第一个列表与其他列表的对”?),现在我不太确定。
【解决方案2】:

你可以使用Enumerable.Intersect:

List<int> commonIds = list1.Intersect(list2.Intersect(list3)).ToList();

因为它使用了一个集合,所以它非常有效。

【讨论】:

  • 为什么不链接Intersect 调用?即Intersect(list2).Intersect(list3)
  • 不需要2个组合的所有交集的并集吗?
  • @PanagiotisKanavos:也可以,这只是我想到的第一个。也许我的嵌套方法更有效,但我对此表示怀疑。
  • @TimSchmelter Jodrell 询问该问题的另一种解释。如果这是您的解释,那么您确实应该搜索并关闭为副本:p
  • @Rawling:是的,我的解释是这样的,因为 OP 的伪代码相当清晰。不,我并不总是有时间搜索重复项,OP 应该在询问之前这样做。
【解决方案3】:

这是一个函数,

它返回所有 2 个集合组合的交集的并集。

public static IEnumerable<T> SharedItems<T>(this IEnumerable<IEnumerable<T>> source)
{
    var pairs =
            from s1 in source
            from s2 in source
            select new { s1 , s2 };

    var intersects = pairs
        .Where(p => p.s1 != p.s2)
        .Select(p => p.s1.Intersect(p.s2));

    return intersects.SelectMany(i => i).Distinct();
}

【讨论】:

  • 这将给出所有集合的联合:)
  • 不用等待,它不会编译。 Union 不能那样工作。但你还需要确保s1 != s2
  • @rawling,同意,这样更好吗?
  • 是的,这也是我最终得到的结果:D
【解决方案4】:

自定义

void Main()
{
     List<int> one = new List<int>() {1, 3, 4, 6, 7};
     List<int> second = new List<int>() {1, 2, 4, 5};

     foreach(int r in one.Intersect(second))
        Console.WriteLine(r);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多