C# 如何从列表中删除父项在同一列表中的项目

C# 如何从列表中删除父项在同一列表中的项目,c#,linq,C#,Linq,我有一个列表 如何使用LINQ删除同一列表中有父项的项目 如果可能的话,我更喜欢方法链表达式 项目定义: public class Item { public int Id { get; set; } public int ParentId { get; set; } } 这可能会有帮助 List<Item> items = new List<Item>(); items.Add(new Item() { Id = 1, Pare

我有一个
列表

如何使用LINQ删除同一列表中有父项的项目

如果可能的话,我更喜欢方法链表达式

项目定义:

public class Item {
        public int Id { get; set; }
        public int ParentId { get; set; }
    }
这可能会有帮助

List<Item> items = new List<Item>();
items.Add(new Item() { Id = 1, ParentId = 2 });
items.Add(new Item() { Id = 2, ParentId = 0 });
items.Add(new Item() { Id = 3, ParentId = 0 });
items.Add(new Item() { Id = 4, ParentId = 1 });
items.Add(new Item() { Id = 5, ParentId = 1 });
items.Add(new Item() { Id = 6, ParentId = 4 });
items.Add(new Item() { Id = 7, ParentId = 4 });
items.Add(new Item() { Id = 8, ParentId = 4 });
items.Add(new Item() { Id = 9, ParentId = 4 });
items.Add(new Item() { Id = 10, ParentId = 4 });
items.Add(new Item() { Id = 11, ParentId = 4 });

var shouldBeRemove =
    (from i in items
     where items.Any(input => input.Id == i.ParentId)
     select i).ToList();

items.RemoveAll(input => shouldBeRemove.Contains(input));

//Those who remain
//item with Id = 2
//item with Id = 3
List items=newlist();
添加(新项(){Id=1,ParentId=2});
添加(新项(){Id=2,ParentId=0});
添加(新项(){Id=3,ParentId=0});
添加(新项(){Id=4,ParentId=1});
添加(新项(){Id=5,ParentId=1});
添加(新项(){Id=6,ParentId=4});
添加(新项(){Id=7,ParentId=4});
添加(新项(){Id=8,ParentId=4});
添加(新项(){Id=9,ParentId=4});
添加(新项(){Id=10,ParentId=4});
添加(新项(){Id=11,ParentId=4});
var应该被移除=
(i)项目中的
其中items.Any(input=>input.Id==i.ParentId)
选择i.ToList();
items.RemoveAll(输入=>shouldBeRemove.Contains(输入));
//剩下的人
//Id为2的项目
//Id为3的项目
这可能会有所帮助

List<Item> items = new List<Item>();
items.Add(new Item() { Id = 1, ParentId = 2 });
items.Add(new Item() { Id = 2, ParentId = 0 });
items.Add(new Item() { Id = 3, ParentId = 0 });
items.Add(new Item() { Id = 4, ParentId = 1 });
items.Add(new Item() { Id = 5, ParentId = 1 });
items.Add(new Item() { Id = 6, ParentId = 4 });
items.Add(new Item() { Id = 7, ParentId = 4 });
items.Add(new Item() { Id = 8, ParentId = 4 });
items.Add(new Item() { Id = 9, ParentId = 4 });
items.Add(new Item() { Id = 10, ParentId = 4 });
items.Add(new Item() { Id = 11, ParentId = 4 });

var shouldBeRemove =
    (from i in items
     where items.Any(input => input.Id == i.ParentId)
     select i).ToList();

items.RemoveAll(input => shouldBeRemove.Contains(input));

//Those who remain
//item with Id = 2
//item with Id = 3
List items=newlist();
添加(新项(){Id=1,ParentId=2});
添加(新项(){Id=2,ParentId=0});
添加(新项(){Id=3,ParentId=0});
添加(新项(){Id=4,ParentId=1});
添加(新项(){Id=5,ParentId=1});
添加(新项(){Id=6,ParentId=4});
添加(新项(){Id=7,ParentId=4});
添加(新项(){Id=8,ParentId=4});
添加(新项(){Id=9,ParentId=4});
添加(新项(){Id=10,ParentId=4});
添加(新项(){Id=11,ParentId=4});
var应该被移除=
(i)项目中的
其中items.Any(input=>input.Id==i.ParentId)
选择i.ToList();
items.RemoveAll(输入=>shouldBeRemove.Contains(输入));
//剩下的人
//Id为2的项目
//Id为3的项目


您的意思是删除具有相同父ID的项目吗?对于所有使用“RemoveAll”的人,该操作将失败。您必须建立相关项目的新列表,然后替换该列表。因为在检查是否应删除“b”之前,您可以删除“a”项,而“a”项是“b”项的父项。@RoeeGavirel感谢您指出,对于树,RemoveAll可能会失败。Idrees-如果这里有任何答案可以解决您的问题,请“批准”它,谢谢。感谢@RoeeGavirel对您的代码进行审阅。您的意思是删除具有相同
ParentId
的项目吗?对于所有使用“RemoveAll”的人,它将失败。您必须建立相关项目的新列表,然后替换该列表。因为在检查是否应删除“b”之前,您可以删除“a”项,它是“b”项的父项。@RoeeGavirel感谢您指出,对于树,RemoveAll可能会失败。Idrees-如果这里有任何答案可以解决您的问题,请“批准”它,谢谢。感谢@RoeeGavirel对您的代码审阅。失败。如果Id-6的父项为4,则不会删除,因为Id-4将在检查之前删除。@RoeeGavirel您是否尝试过您的想法?我测试了它,它工作了,看到你改变了答案,你也做了(-:-->我把(-1)改成(+1)@RoeeGavirel Intersting。你说的那种情况下它工作了!但是对于这个新项目,它没有工作。所以你的想法是正确的。但是你能解释为什么它在第一种情况下工作吗?(当我将id=6的项目的
parentId设置为4时)我能想到的唯一原因是编译器的优化:在多线程中“偶然”运行Linq第一个案例没有失败。失败。如果Id-6的父项为4,则不会删除它,因为Id-4将在检查之前删除。@RoeeGavirel您是否尝试过您的想法?我测试了它,它工作了,看到您更改了答案,您也更改了(-:-->我将(-1)更改为(+1)@RoeeGavirel很有趣。你说的那种情况下它是有效的!但是对于这个新项目它没有。所以你的想法是正确的。但是你能解释为什么它在第一种情况下有效。(当我将id=6到4的项目的
parentId设置为
时)我能想到的唯一原因是编译器的优化:在多线程中运行Linq,“碰巧”它在第一种情况下没有失败。