我在C#中使用List作为数组非常新。所以我在使用它时遇到了问题。
我尝试使用int[]
从List<int[]>
删除Remove
(整数数组)但未能删除{{1}来自int[]
。
这是代码:
List<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);
?
答案 0 :(得分:5)
问题是每个数组类型都是引用类型,List
基于相等性删除项,其中引用类型的相等性默认为引用相等。这意味着,您必须删除与列表中相同的数组。
以下例如非常有效:
int[] t1 = {0,1};
List<int[]> trash = new List<int[]>()
{
t1,
new int[] {1,0},
new int[] {1,1}
};
trash.Remove(t1);
答案 1 :(得分:4)
如果要删除与目标列表具有相同内容(按相同顺序)的所有列表,可以使用Arguments
以及Linq的List.RemoveAll()
SequenceEqual()
但这很慢。如果可以,最好使用索引。
答案 2 :(得分:2)
错误是数组列表使用引用类型数据。因此请使用List的removeAt方法,如下所示:
List<int[]> trash = new List<int[]>()
{
new int[] {0,1},
new int[] {1,0},
new int[] {1,1}
};
trash.RemoveAt(0);
使用RemoveAt,您需要传递要从列表中删除的整数数组的索引。
答案 3 :(得分:0)
您的t1变量是数组的新实例。所以它不会等于列表中的第一个元素。
尝试:
trash.Remove(trash[0]);
或
trash.RemoveAt(0);
答案 4 :(得分: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);
答案 5 :(得分:0)
foreach(var x in trash)
{
if(x[0] == t1[0] && x[1] == t[1])
{
trash.Remove(x);
break;
}
}
这应该起作用
答案 6 :(得分:0)
这只是因为您正在尝试删除新项目。
它的地址引用与列表中已有的对象不同。这就是它不被删除的原因。
Int是值类型.. Int []是引用类型..
所以当你使用Int list
时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()通过使用类型的默认相等比较器来比较元素,确定两个序列是否相等。
答案 7 :(得分:0)
如果你想删除确切的序列,但你没有可能删除确切的对象(来自其他地方的序列),你可以使用lambda表达式或匿名方法搜索正确的序列:
$ /usr/bin/python3
>>> import platform
>>> platform.linux_distribution()
('Ubuntu', '14.04', 'trusty')