gpt4 book ai didi

c# - 从 ienumerable 中过滤重复项

转载 作者:太空狗 更新时间:2023-10-30 00:42:23 25 4
gpt4 key购买 nike

我有一个可能包含重复项的无序枚举,我想删除所有具有重复项的项,并仅保留那些在原始枚举中只出现一次的项。

示例:A 和 C 被删除,因为它们出现不止一次:

输入{A,C,B,A,C,D,A}
输出 {B,D}

一个快速而肮脏的实现可能是:

IEnumerable<T> Filter(IEnumerable<T> items)
{
items.Where(item => items.Count(x => x.Equals(item)) == 1);
}

显然既不快速也不优雅。

下面的示例仍然是二次的(稍微快一些),但需要对输入调用 ToList()。

IEnumerable<T> Filter(IEnumerable<T> items)
{
List<T> src = items.ToList();
for(int i=0; i<src.Count; i++)
{
if (src.IndexOf(src[i], i+1) < 0)
yield return src[i];
}
}

如果您希望它相当紧凑和可读(代码方面),同时又不像这些实现那样慢得让人脑残,您会怎么做?

最佳答案

LINQ 使用 GroupBy 使这变得非常简单:

IEnumerable<String> foo = new[]{ "A", "C", "B", "A", "C", "D", "A" };
Ienumerable<String> result = foo.GroupBy (x => x) // A=>3,C=>2,B=>1,D=>1
.Where(x => x.Count() == 1) // B=>1,D=>1
.Select (x => x.Key); // B,D
  1. 按值(value)分组
  2. 过滤掉只有 1 个条目的那些
  3. 选择原值

不确定性能需要什么,但我个人倾向于发现 GroupBys 可读。

关于c# - 从 ienumerable 中过滤重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15866386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com