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 do
newPersonList.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,我没有说可比。我说过,如果您想通过某个字段值检索对象,可以将其用作键并使用字典。