如何删除列表<;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[] 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();
}
}