两个列表之间的实际差异 - 不是除外

时间:2018-01-25 00:09:26

标签: c# list linq

我们说我有名单

var L1 = new List<int>{1,1,2};
var L2 = new List<int>{1};

如果我这样做

L1.Except(L2)

我得到List<int>{2} - 足够公平。

但有没有像L1.Minus(L2)那样的简写,我会得到List<int>{1,2}

基本上只删除项目在L2中找到它们的次数。

我可以写出来 - 希望我不必这样做。

2 个答案:

答案 0 :(得分:3)

如果您是自己写的,它可能看起来像这样:

mov dx, OFFSET PSPSEG:interrupt_handler

如果您对可读性不那么担心,或者可能是这样:

public static class ExtensionMethods
{
    static public IEnumerable<T> Minus<T>(this IEnumerable<T> input, IEnumerable<T> removal)
    {
        var result = input.ToList();
        foreach (var r in removal) result.Remove(r);
        return result;
    }
}

使用示例:

public static class ExtensionMethods
{
    static public IEnumerable<T> Minus<T>(this IEnumerable<T> input, IEnumerable<T> removal)
    {
        var remaining = removal.ToList();
        return input.Where
        (
            a => !remaining.Remove(a)
        );      
    }
}

输出:

public class Program
{
    public static void Main()
    {
        var L1 = new List<int>{1,1,2};
        var L2 = new List<int>{1};
        var L3 = L1.Minus(L2);


        foreach (var l in L3)
        {
            Console.WriteLine(l);
        }
    }
}

Working example on DotNetFiddle

答案 1 :(得分:2)

使用ForEach和lambda表达式的最小示例:

L2.ForEach(x => L1.Remove(x));