如何从C#中的列表中删除项目?


189

我有一个存储在resultlist中的列表,如下所示:

var resultlist = results.ToList();

看起来像这样:

ID FirstName  LastName
-- ---------  --------
1  Bill       Smith
2  John       Wilson
3  Doug       Berg

如何从列表中删除ID 2?

Answers:


364

List<T> 有两种方法可以使用。

如果您知道项目的索引,则可以使用RemoveAt(int index)。例如:

resultlist.RemoveAt(1);

或者您可以使用Remove(T item)

var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);

如果不确定该项目是否确实存在,可以使用SingleOrDefault。如果没有项目,SingleOrDefault则将返回nullSingle当找不到项目时将抛出异常)。当存在重复值(两个项目具有相同id)时,两者都将抛出。

var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
    resultList.Remove(itemToRemove);

5
好吧,比可能好var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
Vlad12年

1
这不是resultlist.Items.RemoveAt(1);吗?
DreamTeK

48

简短的回答:
删除(从列表results

results.RemoveAll(r => r.ID == 2);将删除与该项目ID 2results(在适当位置)。

过滤器(不从原始列表中删除results):

var filtered = result.Where(f => f.ID != 2);返回除ID 2以外的所有项目

详细答案:

我认为.RemoveAll()这非常灵活,因为您可以列出要删除的商品ID-请参考以下示例。

如果你有:

class myClass {
    public int ID; public string FirstName; public string LastName;
}

并分配了一些值results如下:

var results=new List<myClass> {
    new myClass()  { ID=1, FirstName="Bill", LastName="Smith" },
    new myClass()  { ID=2, FirstName="John", LastName="Wilson" },
    new myClass()  { ID=3, FirstName="Doug", LastName="Berg" },
    new myClass()  { ID=4, FirstName="Bill", LastName="Wilson" },
};

然后,您可以定义要删除的ID列表:

var removeList = new List<int>() { 2, 3 };

并简单地使用它删除它们:

results.RemoveAll(r => removeList.Any(a => a==r.ID));

它将删除项目2和3,并保留项目1和4-由所指定removeList请注意,这是就地发生的,因此不需要其他分配。

当然,您也可以将其用于单个项目,例如:

results.RemoveAll(r => r.ID==4);

在我们的示例中,它将删除ID为4的Bill。


DotNetFiddle:运行演示


45
resultList = results.Where(x=>x.Id != 2).ToList();

我喜欢一个容易实现的Linq小助手,它可以使具有“ where not”条件的查询更易于阅读:

public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
    return source.Where(x=>!predicate(x));
}

//usage in above situation
resultList = results.ExceptWhere(x=>x.Id == 2).ToList();

1
另一个类似的方法(使用谓词)是使用List.FindIndex/ List.RemoteAt(具有变异操作的“不错”或“不太好”的功能)。

的确如此,但是请谨慎地说List的操作正在变异。List在后台使用了一个数组,并且认为必要时可以使用较小或较大的容量重新创建其数组。通常,删除是现有阵列的就地突变。
KeithS 2012年

这不是线程安全的,为了简单起见,您可以只使用SingleOrDefault,它不需要包含在静态方法中

没有人说这是线程安全的(并且是否取决于线程应该执行的操作;实际上,为工作线程提供不同的内存结构而不是让它们全部在一个并发集合上工作可能更可取)。 ),并且OP希望与谓词匹配的记录之外的所有记录,因此SingleOrDefault实际上将返回他们想要的记录。实际上,“静态方法”是一种扩展方法,就像大多数Linq一样,它在不需要的内容(一个或多个元素)比您要定义的内容更容易定义时起作用。
KeithS

5

还有另一种方法。它使用List.FindIndexList.RemoveAt

虽然我可能使用KeithS提出的解决方案(只是简单的Where/ ToList),但这种方法的不同之处在于它会改变原始列表对象。根据期望,这可能是一个好(或坏)的“功能”。

在任何情况下,如果ID上有空格或顺序错误等,FindIndex(加上防护)RemoveAt都将确保正确,并且使用RemoveAt(vs Remove)可以避免在列表中进行第二次 O(n)搜索。

这是LINQPad片段:

var list = new List<int> { 1, 3, 2 };
var index = list.FindIndex(i => i == 2); // like Where/Single
if (index >= 0) {   // ensure item found
    list.RemoveAt(index);
}
list.Dump();        // results -> 1, 3

快乐的编码。


4

您没有指定哪种列表,但是通用List可以使用RemoveAt(index)方法,也可以使用Remove(obj)方法:

// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);

// RemoveAt(index)
resultList.RemoveAt(1);


0

...或者只是resultlist.RemoveAt(1)您确切地知道索引。


0
{
    class Program
    {
        public static List<Product> list;
        static void Main(string[] args)
        {

            list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
                 new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
                 new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
                 new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
                 new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};


            Console.WriteLine("Enter ProductID to remove");
            int uno = Convert.ToInt32(Console.ReadLine());
            var itemToRemove = list.Find(r => r.ProductId == uno);
            if (itemToRemove != null)
                list.Remove(itemToRemove);
            Console.WriteLine($"{itemToRemove.ProductId}{itemToRemove.Name}{itemToRemove.Brand}{itemToRemove.Price}{ itemToRemove.Quantity}");
            Console.WriteLine("------------sucessfully Removed---------------");

            var query2 = from x in list select x;
            foreach (var item in query2)
            {
                /*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*/
                Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
            }

        }

    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.