比较两个List<string>并打印重复项

16

当比较两个List<T>对象时,我遇到了保留重复项的问题。目标是将重复项添加到第三个列表中,称为list3

list1大约有5个项目,而list2有10个项目。

list3应包含以下内容:00T51234, 00T54567, 00T57894

List<string> list1 = new List<string>(){"00T51234", "00T54567", "00T57894",
                     "00T55263", "00T58965"};

List<string> list2 = new List<string>(){"00T59633", "00T52222", "00T57894", 
                     "00T52322", "00T51234", "00T54567", "00T57894", "00T57897",
                     "00T55556", "00T59563"};

List<string> list3 = new List<string>();

我尝试使用Ani的解决方案,如下所示:

var lookup2 = list2.ToLookup(str => str);

var result = from str in list1
         group str by str into strGroup
         let missingCount 
              = Math.Max(0, strGroup.Count() - lookup2[strGroup.Key].Count())
         from missingStr in strGroup.Take(missingCount)
         select missingStr;

然而,这个解决方案并没有给我想要的结果。非常感谢您提供任何帮助。谢谢!

2个回答

34

最后,调用 ToList() 完成它。原帖指定所需结果为第三个列表。 - Eric Lippert
谢谢!这正是我需要的。您能否确认Intersect是否是Except的相反操作? - toose121
2
@toose121 这并不是完全相反的情况 - a.Except(b) 将会给你在 a 中存在但是在 b 中不存在的元素 - 它不会给你在 b 中存在但是在 a 中不存在的元素。 - D Stanley
我相信确切的相反之处应该是 a.联合(b).除去(a.交集(b)) - Erik Philips

-1

我觉得我应该写下几个例子。这是从上面选出的一些例子,但我需要更多的内部右连接。来看看吧。

using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public class Program
    {
        public static void Main()
        {
            //Intersect
            var listA = new List<string>{"A", "B", "C", "D", "G"};
            var listB = new List<string>{"C", "C", "A", "E", "A", "F", "Q", "Q"};
            var matching = listA.Intersect(listB).ToList();
            Console.WriteLine(matching.Str());
            
            //Right Inner Join
            var query = listA.GroupJoin(listB, a => a, b => b, (a, abList) => abList.ToList());
            Console.WriteLine(query.Str());
            
            //Inner Distinct
            var innerDist = listA.Union(listB);
            Console.WriteLine(innerDist.Str());
            
            //Outter Distinct
            var flippedDupMatch = listB.Union(listA).Except(listB.Intersect(listA));
            Console.WriteLine(flippedDupMatch.Str());
        }
    }
    
    public static class Temp
    {
        public static string Str(this IEnumerable<string> str)
        {
            return str.Count() + " " + string.Join(",", str);
        }
    
        public static string Str(this List<string> str)
        {
            return str.Count() + " " + string.Join(",", str);
        }
    
        public static string Str(this IEnumerable<List<string>> str)
        {
            return str.SelectMany(x => x).ToList().Str();
        }
    }

{{link1:.netFiddle}}


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