相交两个列表c#

时间:2014-07-28 19:19:36

标签: c# linq list

您好我有这两个列表

List<string> list1 = {"404a49ad-d80f-4ef7-99ab-0996de3b70d4_29190_806.jpg|Name1", "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29197_806.jpg|Name2", "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29210_868.jpg|Name3"}
List<string> list2 = {"404a49ad-d80f-4ef7-99ab-0996de3b70d4_29190_806.jpg","404a49ad-d80f-4ef7-99ab-0996de3b70d4_29197_806.jpg"}

我希望将list1的值与&#39; |&#39; 字符用list2值相交,但我想返回list1的完整字符串而不仅仅是第一部分用&#39; |&#39;字符。

这是我想要的结果:

var finalList = {"404a49ad-d80f-4ef7-99ab-0996de3b70d4_29190_806.jpg|Name1", "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29197_806.jpg|Name2"}

我不知道它是否可以使用instersect功能,或者我可以使用另一种方法。我已尝试在谓词中使用包含函数,但需要花费很多时间才能找到匹配项。

我使用大约2000个元素的大型列表

谢谢!

3 个答案:

答案 0 :(得分:5)

试试这个,使用你的例子在LinqPad中给出预期的结果:

var intersection =
    list1.Join(
        list2,
        l1 => l1.Split('|')[0], //Selector for items from the inner list splits on '|'
        l2 => l2,               //Select the current item
        (l1, l2) => l1);

答案 1 :(得分:0)

list2编译为HashSet<string>以允许快速查找。然后,使用简单的Where过滤器,针对此集合执行list1子字符串的查找。

List<string> list1 = new List<string> { "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29190_806.jpg|Name1", "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29197_806.jpg|Name2", "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29210_868.jpg|Name3" };
List<string> list2 = new List<string> { "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29190_806.jpg", "404a49ad-d80f-4ef7-99ab-0996de3b70d4_29197_806.jpg" };

var list2HashSet = new HashSet<string>(list2);
var finalList = list1.Where(s => list2HashSet.Contains(s.Substring(0, s.IndexOf('|')))).ToList();

请注意,s.Substring(0, s.IndexOf('|'))在语义上等同于s.Split('|')[0](假设所有字符串都包含|),但避免了为{{1}后面的文本分配另一个字符串实例的开销}}

答案 2 :(得分:-1)

使用where迭代列表。使用Split方法获取您感兴趣的第一部分,然后检查list2是否包含该字符串。最后调用ToList将结果转换为列表。

var finalList = list1.Where(x => list2.Contains(x.Split(new []{'|'})[0})).ToList();