如何删除列表<;int[]>;来自另一个列表<;int[]>;

本文关键字:int gt lt 列表 另一个 何删除 删除 | 更新日期: 2023-09-27 17:59:02

这是我上一个问题的结果如何从列表中删除int[]<int[]>?

我现在正在尝试删除list int[]中的一个int[]列表。

int[] t1 = new int[] { 0, 2 };
        List<int[]> trash = new List<int[]>()
        {
            t1,
            new int[] {0,2},
            new int[] {1,0},
            new int[] {1,1}
        };
        List<int[]> trash2 = new List<int[]>()
        {
            new int[] {0,1},
            new int[] {1,0},
            new int[] {1,1}
        };
        MessageBox.Show(trash.Count + "");
        trash.RemoveRange(trash2);
        MessageBox.Show(trash.Count + "");

我试图将trash2中的所有int[]添加到trash数组中,然后从trash2数组中删除具有相同值的项,但它只从trash2中删除了第一个int[]。

他们还有其他从列表数组中删除列表数组的方法吗?

如何删除列表<;int[]>;来自另一个列表<;int[]>;

这是您的答案

int[] t1 = new int[] { 0, 2 };
List<int[]> trash = new List<int[]>()
{
    t1,
    new int[] {0,2},
    new int[] {1,0},
    new int[] {1,1}
};
List<int[]> trash2 = new List<int[]>()
{
    new int[] {0,1},
    new int[] {1,0},
    new int[] {1,1}
};
Console.WriteLine(trash.Count + "");//Count = 4
trash.RemoveAll(a => trash2.Any(b => b.SequenceEqual(a)));
Console.WriteLine(trash.Count + "");//Count = 2

前面的回答中提到了一些SequenceEqual逻辑https://stackoverflow.com/a/30997772/1660178

另一种方法涉及使用.Except扩展方法和自定义IEqualityComparer。以下代码也会产生您需要的结果:

public class IntArrayComparer : IEqualityComparer<int[]>
{
    public bool Equals(int[] x, int[] y)
    {
        return x.SequenceEqual(y);
    }
    public int GetHashCode(int[] x)
    {
        return x.Aggregate((t,i) => t + i.GetHashCode());
    }
}  
class Program
{
    static void Main(string[] args)
    {
        int[] t1 = new int[] { 0, 2 };
        List<int[]> trash = new List<int[]>()
        {
            t1,
            new int[] {0,2},
            new int[] {1,0},
            new int[] {1,1}
        };
        List<int[]> trash2 = new List<int[]>()
        {
            new int[] {0,1},
            new int[] {1,0},
            new int[] {1,1}
        };
        var difference = trash.Except(trash2, new IntArrayComparer()).ToArray();
    }
}