从列表中删除Object属性,但不删除整个索引

时间:2017-11-05 01:21:32

标签: c#

正在搜索这个答案,但没有找到答案。

有没有办法只从列表的特定索引中删除其中一个属性?事件可能吗?

所以,如果我有一个清单:

List<Person> people = new List<Person>();

其中:

public class Person
{
    #region Public Properties

    public string Name { get; set; }
    public string Age { get; set; }

    #endregion
}

并且假设我们有三个索引,每个索引都包含x个属性:

  1. 姓名:&#39; Bob&#39;年龄:21
  2. 姓名:&#39;莎拉&#39;年龄19岁
  3. 姓名:&#39; Mary&#39; 29岁
  4. 是否可以删除,例如姓名&#39; Sarah&#39;但不是&#39; 19&#39;

    的年龄

    我试图这样做,但没有运气,因为它删除了整个索引而不是名称:

    people.RemoveAll(p => p.Name == "Sarah")
    

2 个答案:

答案 0 :(得分:1)

  

是否可以删除,例如名称'Sarah'而不是年龄为'19'?

不使用您发布的代码,但事实并非如此。值"Sarah"19本质上是绑定的,因为它们都是Person类的声明成员。 Person的任何实例总是都有NameAge属性的值。

根据您实际尝试做的事情(您的问题相当模糊),您可能会发现仅设置Name属性null很有用。然后其他代码可以使用null值来指示“此属性不存在”。该物业仍将实际存在,并具有价值。但是该值将为null,因此其余代码可以在此基础上忽略它,就好像它不存在一样。

解决问题的另一种方法是存储没有预先声明的属性集的对象。例如,您可以将数据存储为字典。坦率地说,这是不可取的,因为你将失去静态(编译时)类型安全和属性命名的所有优点。但这是可以完成的。它看起来像这样:

List<Dictionary<string, object>> people = new List<Dictionary<string, object>>()
    {
        new Dictionary<string, object>
            {
                { "Name", "Bob" },
                { "Age", 21}
            },
        new Dictionary<string, object>
            {
                { "Name", "Sarah" },
                { "Age", 19 }
            },
        new Dictionary<string, object>
            {
                { "Name", "Mary" },
                { "Age", 29 }
            },
    };

然后,如果您有特定的索引,则要删除名称,而不是年龄:

int index = ...;

people[index].RemoveKey("Name");

答案 1 :(得分:-1)

这是我认为你需要的:

people.Where(person => person.Age == 19)
    .ToList()
    .ForEach(person => person.Name = null);