【问题标题】:c# remove item from list without knowing index numberc# 在不知道索引号的情况下从列表中删除项目
【发布时间】:2013-09-20 17:24:03
【问题描述】:

我有一个包含我的对象集合的列表:

List<MyObj> list = new List<MyObj>();

我的函数接收 MyObj 作为参数,我想从列表中删除此对象,如此处建议:c# remove item from list

    private void remove(MyObj obj)
    {
        var itemToRemove = list.Where(x => x.fileName == obj.fileName);

        if (itemToRemove != null)
            list.Remove(itemToRemove);
    }

收到编译器错误:

无法从“System.Collections.Generic.IEnumerable”转换为“namespace.MyObj”

【问题讨论】:

  • 在相关说明中,我建议不要使用 var 关键字,除非您作为开发人员已经知道它应该是什么类型。
  • 请记住,LINQ 查询返回一个 IEnumerable,除非您通过将其包装在 .First() 或 .FirstOrDefault() 中来定义它
  • 这能回答你的问题吗? How to remove item from list in C#?

标签: c#


【解决方案1】:

Where() 返回一个IEnumerable&lt;&gt;

试试这个:

private void remove(MyObj obj)
{
    var itemToRemove = list.Where(x => x.fileName == obj.fileName);

    if (itemToRemove.Any())
        list.Remove(itemToRemove.First());
}

更好的是,因为您正在使用List&lt;&gt;:

list.RemoveAll(x => x.fileName == obj.fileName);

编辑

其他解决方案,在下面的 cmets 中同样可行。选择你的毒药,虽然自私(也许很明显)我更喜欢RemoveAll 方法的可读性和简单性:

针织:

list = list.Where(x => x.filename != obj.filename).ToList();

杰伦·范朗根:

var itemToRemove = list.Where(x => x.fileName == obj.fileName).FirstOfDefault(); 
if (itemToRemove != null)
    list.Remove(itemToRemove);

【讨论】:

  • 为什么不直接list = list.Where(x =&gt; x.filename != obj.filename).ToList();?
  • @knittl,这是另一种方法,是的,但我认为它不像它在做什么那样可读。 :)
  • @knittl - 与创建新列表相比,编辑列表 不是更有效吗,尤其是在有很多项目的情况下?
  • 我宁愿使用var itemToRemove = list.Where(x =&gt; x.fileName == obj.fileName).FirstOfDefault(); if (itemToRemove != null)
  • 通过循环遍历我的所有列表与 list.Where(...) 相比有什么不同?
【解决方案2】:

你在Where和FirstOrDefault之间搞混了:

private void remove(MyObj obj)
{
    var itemToRemove = list.FirstOrDefault(x => x.fileName == obj.fileName);
    if (itemToRemove != null)
        list.Remove(itemToRemove);
}

【讨论】:

    【解决方案3】:

    你不需要实现这个方法,List的remove方法已经按预期执行了这个操作。

    http://msdn.microsoft.com/en-us/library/cd666k3e.aspx

    public bool Remove(
        T item
    )
    

    【讨论】:

    • 这通过引用相等性删除,而 OP 希望删除相关类的属性(在这种情况下,fileName)。
    【解决方案4】:

    您应该使用列表公开的RemoveAll 方法来删​​除所有匹配的元素-

    private void remove(MyObj obj)
    {
        var itemToRemove = list.RemoveAll(x => x.fileName == obj.fileName);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2021-01-05
      相关资源
      最近更新 更多