.net 如何在C#中从列表中删除项目?

eaf3rand  于 2022-12-14  发布在  .NET
关注(0)|答案(9)|浏览(195)

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

var resultlist = results.ToList();

它看起来像这样:

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

如何从列表中删除ID 2?

g52tjvyc

g52tjvyc1#

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);
scyqe7ek

scyqe7ek2#

简短答复:
删除(从列表results中)

results.RemoveAll(r => r.ID == 2);将删除resultsID为2的项(在适当位置)。

筛选器(不从原始列表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" },   // results[0]
    new myClass { ID=2, FirstName="John", LastName="Wilson" },  // results[1]
    new myClass { ID=3, FirstName="Doug", LastName="Berg" },    // results[2]
    new myClass { ID=4, FirstName="Bill", LastName="Wilson" }   // results[3]
};

然后,您可以定义要删除的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。
最后要提到的是列表有一个索引器,也就是说,它们也可以像动态数组一样被访问,即results[3]将给予你结果列表中的第4个元素(因为第一个元素的索引为0,第二个元素的索引为1,以此类推)。
因此,如果您想删除名字与结果列表第4个元素中的名字相同的所有条目,您可以简单地这样做:

results.RemoveAll(r => results[3].FirstName == r.FirstName);

注意,之后,只有John和Doug将保留在列表中,Bill将被移除(示例中的第一个和最后一个元素)。重要的是,列表将自动收缩,因此它只剩下2个元素-因此,在本示例中,在执行RemoveAll之后允许的最大索引是1
(即results.Count() - 1)。
一些琐事:您可以利用这些知识创建局部函数

void myRemove()  { var last = results.Count() - 1; 
                   results.RemoveAll(r => results[last].FirstName == r.FirstName); }

如果你调用这个函数两次,你认为会发生什么?

myRemove(); myRemove();

第一次调用将删除第一个和最后一个位置的Bill,第二次调用将删除Doug,只有John Wilson保留在列表中。

**注意:**由于C# Version 8,您也可以写入results[^1],而不是var last = results.Count() - 1;results[last]

void myRemove()  =>  results.RemoveAll(r => results[^1].FirstName == r.FirstName);

所以你不再需要局部变量last(见索引和范围)。此外,因为它是一行程序,你不需要花括号,可以用=>代替。要查看C#中所有新特性的列表,请查看here
点网小提琴:Run the demo

wwodge7n

wwodge7n3#

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

有一个我喜欢的Linq helper,它很容易实现,可以使带有“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();
9o685dep

9o685dep4#

您不必指定列表的类型,但是泛型List可以使用RemoveAt(index)方法或Remove(obj)方法:

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

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

nmpmafwu5#

更简化:

resultList.Remove(resultList.Single(x => x.Id == 2));

不需要创建新的VAR对象。

t0ybt7op

t0ybt7op6#

还有另一种方法,它使用List.FindIndexList.RemoveAt
虽然我 * 可能 * 会使用KeithS提出的解决方案(只是简单的Where/ToList),但这种方法的不同之处在于它 * 变异 * 了原始列表对象,这可能是一个好的(或坏的)“特性”,取决于预期。
在任何情况下,FindIndex(与保护耦合)确保如果ID中存在间隙或排序错误等,则RemoveAt将是正确的,并且使用RemoveAt(与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

编程愉快。

e3bfsja2

e3bfsja27#

请尝试以下代码:

resultlist.Remove(resultlist.Find(x => x.ID == 2));
lvmkulzt

lvmkulzt8#

...或者如果您确切知道索引,则只需resultlist.RemoveAt(1)

px9o7tmv

px9o7tmv9#

{
    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}");
            }

        }

    }
}

相关问题