您好我有这两个列表
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个元素的大型列表
谢谢!
答案 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();