C# 按值从列表中删除项
我有一个类对象列表,想要删除一个项,但它不起作用:C# 按值从列表中删除项,c#,class,C#,Class,我有一个类对象列表,想要删除一个项,但它不起作用: class Person { public string name; public Person(string s) { this.name = s; } } void ABC() { List<Person> newPersonList = new List<Person>
class Person
{
public string name;
public Person(string s)
{
this.name = s;
}
}
void ABC()
{
List<Person> newPersonList = new List<Person>();
newPersonList.Add(new Person("A"));
newPersonList.Add(new Person("B"));
newPersonList.Add(new Person("C"));
newPersonList.Remove(A);
newPersonList.RemoveAt(1);
}
班级人员
{
公共字符串名称;
公众人士
{
this.name=s;
}
}
无效ABC()
{
List newPersonList=新列表();
newPersonList.Add(新的人(“A”));
新增人员名单。添加(新增人员(“B”);
添加(新的人(“C”);
newPersonList。删除(A);
newPersonList.RemoveAt(1);
}
RemoveAt(1)工作并删除ID为1的项
我认为Remove(A)应该删除值为“A”的项目。但这是行不通的。有人能解释一下原因吗?什么是按值删除的正确方法 按元素的属性值从列表中删除的最简单方法:
newPersonList.RemoveAll(p => p.name == "A");
更好的方法是像这样改变人
:
class Person : IEquatable<Person>
{
public readonly string Name;
public Person(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("name");
Name = name;
}
public static implicit operator string(Person p)
{
return p.Name;
}
public static implicit operator Person(string name)
{
return new Person(name);
}
public bool Equals(Person other)
{
return Name.Equals(other.Name);
}
}
var newPersonList = new List<Person>
{
new Person("A"),
new Person("B"),
new Person("C")
};
newPersonList.Remove("A");
var newPersonList = new List<Person> { "A", "B", "C" };
newPersonList.Remove(new Person("A"));
班级人员:可胜任
{
公共只读字符串名称;
公众人物(字符串名称)
{
if(string.IsNullOrWhiteSpace(name))
抛出新的ArgumentException(“名称”);
名称=名称;
}
公共静态隐式运算符字符串(Person p)
{
返回p.Name;
}
公共静态隐式运算符Person(字符串名称)
{
返回新的人员(姓名);
}
公共布尔等于(其他人)
{
返回Name.Equals(其他.Name);
}
}
然后像这样使用它:
class Person : IEquatable<Person>
{
public readonly string Name;
public Person(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("name");
Name = name;
}
public static implicit operator string(Person p)
{
return p.Name;
}
public static implicit operator Person(string name)
{
return new Person(name);
}
public bool Equals(Person other)
{
return Name.Equals(other.Name);
}
}
var newPersonList = new List<Person>
{
new Person("A"),
new Person("B"),
new Person("C")
};
newPersonList.Remove("A");
var newPersonList = new List<Person> { "A", "B", "C" };
newPersonList.Remove(new Person("A"));
var newPersonList=新列表
{
新人士(“A”),
新人士(“B”),
新人(“C”)
};
newPersonList.Remove(“A”);
甚至像这样:
class Person : IEquatable<Person>
{
public readonly string Name;
public Person(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("name");
Name = name;
}
public static implicit operator string(Person p)
{
return p.Name;
}
public static implicit operator Person(string name)
{
return new Person(name);
}
public bool Equals(Person other)
{
return Name.Equals(other.Name);
}
}
var newPersonList = new List<Person>
{
new Person("A"),
new Person("B"),
new Person("C")
};
newPersonList.Remove("A");
var newPersonList = new List<Person> { "A", "B", "C" };
newPersonList.Remove(new Person("A"));
var newPersonList=新列表{“A”、“B”、“C”};
newPersonList.Remove(新的人(“A”));
那么你想让.net神奇地猜出,通过“A”
字符串,你指的是字段名称
?它应该如何推导它呢
如果你想按键(本例中的名称)操作,我建议你使用字典:
var dict=newdictionary(){
{“A”,新人(“A”)}
}
//后来
命令删除(“A”);
您尚未声明A.To donewPersonList.Remove(A)代码>
您必须声明一个对象Person并将其添加到newPersonList
Person A = new Person("A");
newPersonList.Add(A);
就像其他人说的“什么是A
?”。如果它是一个包含Person
的变量,那么这将起作用
void ABC()
{
var A = new Person("A");
var B = new Person("B");
var C = new Person("C");
List<Person> newPersonList = new List<Person>();
newPersonList.Add(A);
newPersonList.Add(B);
newPersonList.Add(C);
newPersonList.Remove(A);
}
void ABC()
{
var A=新人员(“A”);
var B=新人员(“B”);
var C=新人员(“C”);
List newPersonList=新列表();
添加(A);
新个人列表。添加(B);
添加(C);
newPersonList。删除(A);
}
您认为在删除(A)时应该发生什么代码>?您尚未声明A
。通常,您需要在Person
中重写Equals
或/并实现IEquatable
他可以使用newPersonList.RemoveAll(p=>p.name==“A”)
。您的方法需要扫描列表两次。但最好是在Person
中重写Equals
,或者让它实现IEquatable
。然后Remove
按预期工作。@TimSchmelter平均复杂度更适合我的解决方案=)@astef否,您的解决方案的平均复杂度没有更低。它做的工作更多,而不是更少。@astef:另外,如果没有name=“A”的人,您的方法会抛出一个错误。如果使用FirstOrDefault
来防止删除null
的人员。您的第二个aproach仅在偶然情况下起作用,因为引用是比较的。OP想用名字来比较。@TimSchmelter什么都同意。我根据你的建议编辑了我的答案。这比这更神奇,因为它只是A
,而不是字符串“A”
。我想他真的是指字符串,否则就是A没有任何意义。如果你想让类具有可比性,你使用字典吗?您只需要提供一种方法,用于确定两个对象是否相等,即等于
@TimSchmelter,我没有说可比。我说过,如果您想通过某个字段值检索对象,可以将其用作键并使用字典。