从不在*所有*位置的列表中删除项目 - c#

我的对象看起来像:

public class ListItem {
    public int ItemId { get; set; }
    public int LocationId { get; set; }
    // ... other properties ...
}

我有从数据库中加载的这些项目(List<ListItem>)的列表。这些按商品ID和位置ID是唯一的。我碰巧知道总共只有10个位置(位置ID为1-10)。

我可以写一条LINQ语句来删除所有10个位置都没有出现的项目吗?

我现在所拥有的是:

myList.RemoveAll(x =>
        // this line would need repeated 10 times to work!
        !myList.Any(y => y.ItemId == x.ItemId && y.LocationId == 1) &&
        !myList.Any(y => y.ItemId == x.ItemId && y.LocationId == 2)
        // etc...
    );

因为这仅检查一个区域,所以我必须对所有区域都重复一次-不是很优雅的代码。任何想法或帮助表示赞赏!

参考方案

您可以使用GroupBy按ItemId分组元素,然后删除分组中没有10个项目的所有元素:-

var itemsNotAtAllLocations = myList.GroupBy(x => x.ItemId)
                                   .Where(g => g.Count() != 10)
                                   .Select(g => g.Key);

myList.RemoveAll(x => itemsNotAtAllLocations.Contains(x.ItemId));

或者,如果您更喜欢查询语法:

var itemsNotAtAllLocations = from item in mylist
                             group item by item.ItemId into g
                             where g.Count() != 10
                             select g.Key;

评论中有建议改为执行以下操作:-

myList.RemoveAll(x => myList.Count(y => y.ItemId == x.ItemId) != 10);

关于此,我将提供以下反馈:

我会在这里为了简洁而不是简洁进行优化。许多开发人员发现密集的LINQ难以阅读,明确的意图声明(itemsNotAtAllLocations)可以节省大量时间。
您的版本节省了创建(可能很小)的数据结构的开销,但是却以更频繁地遍历(可能很大)的数据结构为代价。对我来说,听起来像是要做很多事,而不是更少。
我非常怀疑这对性能的影响是否重大。
如果性能对您很重要,则应设置以利益相关者为中心的基准并在实际条件下进行衡量。
如果效果对您来说很重要,我希望您可以采用其他方法来做得更好,例如您可以在数据库层进行查询,还是可以首先使用更合适的数据结构(即代表分组的固有结构)?

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

Linq-在嵌套集合中查找元素 - c#

我有一个通用列表-SupportedTypeGroups。每个SupportedTypeGroup都有SupportedTypes属性(SupportedType的通用列表)。如何构造Linq查询以使用所需名称查找SupportedType? 参考方案 var result = SupportedTypeGroups .SelectMany(g => …

LINQ RemoveAll代替循环 - c#

我有两个for循环,用于从列表中删除项目。我正在为这些循环寻找等效的LINQ语句for (Int32 i = points.Count - 1; i >= 0; i--) { for (Int32 j = touchingRects.Count - 1; j >= 0; j--) { if (touchingRects[j].HitTest(po…

如何知道是否由父母造成了回合(A => B => C => A) - c#

我有以下结构:[Employee] ID Manager1ID Manager2ID 场景:我要进行验证,以确保所选的Manager1或Manager2不会引起回合。换句话说,我想知道这种情况是否存在:A的经理是B,B的经理是C,C的经理也是A //无效A => B => C => A告诉用户A不是C的有效管理员,因为C已经是A的管理员。问…