如何从列表中删除int[]<;int[]>;
本文关键字:int lt gt 列表 删除 | 更新日期: 2023-09-27 17:59:01
我对在C#中使用List作为数组很陌生。所以我在使用它时遇到了一个问题。
我试图使用Remove
从List<int[]>
中删除int[]
(整数数组),但未能从List<int[]>
中删除int[]
。
这是代码:
List<int[]> trash = new List<int[]>()
{
new int[] {0,1},
new int[] {1,0},
new int[] {1,1}
};
int[] t1 = {0,1};
trash.Remove(t1);
这只是一个bug吗?或者它不识别int[]
?
问题是每个数组类型都是引用类型,List
删除基于相等的项,其中引用类型的相等默认为引用相等。这意味着,您必须删除与列表中相同的数组。
以下示例运行良好:
int[] t1 = {0,1};
List<int[]> trash = new List<int[]>()
{
t1,
new int[] {1,0},
new int[] {1,1}
};
trash.Remove(t1);
如果您想删除所有与目标列表具有相同内容(按相同顺序)的列表,可以使用List.RemoveAll()
和Linq的SequenceEqual()
:
List<int[]> trash = new List<int[]>
{
new [] {0, 1},
new [] {1, 0},
new [] {1, 1}
};
int[] t1 = {0, 1};
trash.RemoveAll(element => element.SequenceEqual(t1));
Console.WriteLine(trash.Count); // Prints 2
不过这是非常缓慢的。如果可以的话,最好使用索引。
错误是数组列表使用引用类型数据。因此,请使用列表的removeAt方法,如下所示:
List<int[]> trash = new List<int[]>()
{
new int[] {0,1},
new int[] {1,0},
new int[] {1,1}
};
trash.RemoveAt(0);
使用RemoveAt,您需要传递要从列表中删除的整数数组的索引。
t1变量是数组的一个新实例。所以它不会等于列表中的第一个元素。
尝试:
trash.Remove(trash[0]);
或
trash.RemoveAt(0);
.Remove方法查找元素的地址。如果它们相等,则删除。你应该这样做。
int[] t1 = {0,1};
int[] t2 =new int[] {1,0};
int[] t3 =new int[] {1,1};
List<int[]> trash = new List<int[]>()
{
t1,t2,t3
};
trash.Remove(t1);
foreach(var x in trash)
{
if(x[0] == t1[0] && x[1] == t[1])
{
trash.Remove(x);
break;
}
}
这应该也适用
这只是因为您试图删除新项。
它的地址引用与列表中已存在的对象不同。这就是为什么它没有被删除。
Int是值类型。。Int[]是引用类型。。
所以当你使用Int列表时
List<int> trash = new List<int>(){ 1, 13, 5 };
int t1 = 13;
trash.Remove(t1);//it will removed
但对于Int[]
List<int[]> trash = new List<int[]>()
{
new int[] {0,1},
new int[] {1,0},
new int[] {1,1}
};
var t1 = {0,1};
trash.Remove(t1);//t1 will not removed because "t1" address reference is different than the "new int[] {0,1}" item that is in list.
删除-
trash.Remove(trash.Find(a => a.SequenceEqual(t1)));
SequenceEqual()通过使用元素类型的默认相等比较器比较元素来确定两个序列是否相等。
如果你想删除确切的序列,但你不可能删除确切的对象(来自其他地方的序列),你可以使用lambda表达式或匿名方法搜索正确的序列:
List<int[]> trash = new List<int[]>
{
new [] {0, 1},
new [] {1, 0},
new [] {1, 1}
};
int[] t1 = { 0, 1 };
//using anonymous method
trash.RemoveAll(delegate(int[] element) { return element.SequenceEqual(t1); });
//using lambda expression
trash.RemoveAll(element => element.SequenceEqual(t1));