我有类型的类列表:
public class MyClass
{
public SomeOtherClass classObj;
public string BillId;
}
public List<MyClass> myClassObject;
样本值:
BillId = "123",classObj = {},
BillId = "999",classObj = {},
BillId = "777",classObj = {},
BillId = "123",classObj = {}
在上面的例子中,我们有BillId
的重复值。我想删除所有重复值(不区分),这样结果将只包含999
和777
值。
实现这一点的一种方法是
- 循环遍历所有项目
- 获取唯一
BillId
的计数 - 如果count大于1,则将
BillId
存储在另一个变量中 - 再次循环并基于
BillId
移除项目
有没有直接的方法可以达到这个目的?
6条答案
按热度按时间klsxnrf11#
我想这是可行的:
小提琴here
rggaifut2#
你也可以这么做,
moiiocjp3#
这可能会有帮助。
cczfrluj4#
.Where(x => x.Count()==1)
对我不好。您可以尝试:
yc0p9oo05#
试试这个。
hujrc8aj6#
您需要一个简单明了的解决方案来解决这个问题,
GroupBy
+Where
+Select
解决方案可以完美地满足这个需求,但是您可能也会对高性能和内存效率的解决方案感兴趣。下面是一个使用当前可用的所有工具(. NET 6+)来实现最大效率的实现:TryGetNonEnumeratedCount
+EnsureCapacity
组合可能会对枚举源时分配的内存量产生重大影响,如果源是大小已知的类型,如List<T>
。CollectionsMarshal.GetValueRefOrAddDefault
确保每个密钥只被散列一次,这在密钥具有昂贵的GetHashCode
实现的情况下会产生影响。用法示例:
Online demo.
上面的
UniqueBy
与内置的DistinctBy
LINQ运算符的不同之处在于,前者完全消除了所有重复项,而后者保留了每个重复元素的第一个示例。