两个列表之间的差异保留重复

Dus*_*gen 8 c# linq

我有两个清单:

var list1 = new List<string> { "A", "A", "B", C" };
var list2 = new List<string> { "A", "B" };
Run Code Online (Sandbox Code Playgroud)

我想制作一个像这样的清单

var result = new[] { "A", "C" };
Run Code Online (Sandbox Code Playgroud)

如果列表是从中list1删除的所有元素list2我不认为有这样的Linq扩展方法,因为Except删除重复.

非linq的方法是:

var tempList = list1.ToList();
foreach(var item in list2)
{
    tempList.Remove(item);
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一个我可能错过的Linq扩展方法.

编辑:

因为这里可能没有任何扩展方法.

public static class LinqExtensions
{
    public static IEnumerable<T> RemoveRange<T>(this IEnumerable<T> source, IEnumerable<T> second)
    {
        var tempList = source.ToList();

        foreach(var item in second)
        {
            tempList.Remove(item);
        }

        return tempList;
    }

    public static IEnumerable<TFirst> RemoveMany<TFirst, TSecond>(this IEnumerable<TFirst> source, IEnumerable<TSecond> second, Func<TSecond, IEnumerable<TFirst>> selector)
    {
        var tempList = source.ToList();

        foreach(var item in second.SelectMany(selector))
        {
            tempList.Remove(item);
        }

        return tempList;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

list1.RemoveRange(list2)
Run Code Online (Sandbox Code Playgroud)

Ani*_*Ani 2

看看你的例子,我认为你的意思是“从 list1 中删除 list2 中的所有元素”:

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;
Run Code Online (Sandbox Code Playgroud)