在C#中使用Linq匹配两个集合之间的元素

22

我有一个问题,关于如何在linq中完成常见的编程任务。

假设我们有两个不同的集合或数组。我想要做的是匹配这些数组之间的元素,如果有匹配项,则对该元素进行某些操作。

例如:

        string[] collection1 = new string[] { "1", "7", "4" };
        string[] collection2 = new string[] { "6", "1", "7" };

        foreach (string str1 in collection1)
        {
            foreach (string str2 in collection2)
            {
                if (str1 == str2)
                {
                    // DO SOMETHING EXCITING///
                }
            }
        }

使用上面的代码显然可以实现这一点,但我想知道是否有一种快速简洁的方法可以使用LinqtoObjects来完成这个问题?

谢谢!


这将取决于// DO SOMETHING EXCITING///的实现方式。这可能甚至不可能,因为Ling基于IEnumerable,而此代码可以做任何事情。 Linq为您构建数据结构。 // DO SOMETHING EXCITING///做了什么? - Hamish Grubijan
顺便说一下,您可以使用两个集合数据结构的实例将O(n^2)减少到O(n)。 - Hamish Grubijan
2个回答

32

是的,交集 - 用代码示例说明。

string[] collection1 = new string[] { "1", "7", "4" };
string[] collection2 = new string[] { "6", "1", "7" };

var resultSet = collection1.Intersect<string>(collection2);

foreach (string s in resultSet)
{
    Console.WriteLine(s);
}

交集是最清晰的,但你为什么要用“并集”这个名称? - Hamish Grubijan
10
因为我正在观看圣徒-维京人的比赛,有些分心。好的,我会进行编辑。 - Ragepotato
1
如果集合是不同的类,其中ClassA.string需要匹配ClassB.string,那该怎么办? - Grant
在Python中,有时可以提供一个lambda,就像这样:m = min(coll, key=lambda x: x.field1)。这样做的作用是计算具有最小值'field1'的最小元素。我认为Lambdas也可以与Linq一起使用。虽然我不是专家,但如果Intersect接受一个lambda作为可选参数,那将是很好的。 - Hamish Grubijan
忘了提到,在Python中,您还可以为min提供一个cmp参数:m = min(coll, cmp = lambda x,y: x.field1 - y.field1) - 应该可以实现相同的结果。我相信您可以想到其他使用cmp=的情况。 - Hamish Grubijan

13

如果你想在匹配时执行任意代码,这将是一种类似于LINQ的方式。

var query = 
   from str1 in collection1 
   join str2 in collection2 on str1 equals str2
   select str1;
foreach (var item in query) { // 做一些有趣的事情 Console.WriteLine(item); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接