Sae*_*eid 70 c# lambda list generic-list c#-4.0
什么是从列表中删除重复值的最快方法.假设List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
我很有兴趣使用lambda删除重复并返回:{1, 2, 3, 4, 5}
.你的建议是什么?
Jon*_*eet 124
获取新列表的最简单方法是:
List<long> unique = longs.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)
这对您来说是否足够好,或者您是否需要改变现有列表?后者显然更加冗长.
请注意,Distinct()
不保证保留原始顺序,但在当前实现中它将 - 并且这是最自然的实现.有关更多信息,请参阅我的Edulinq博客文章Distinct()
.
如果你不需要它List<long>
,你可以保持它:
IEnumerable<long> unique = longs.Distinct();
Run Code Online (Sandbox Code Playgroud)
此时,每次迭代时都会进行重复数据删除unique
.这是好还是不取决于您的要求.
Jon*_*Rea 81
您可以将此扩展方法用于包含更复杂类型的枚举:
IEnumerable<Foo> distinctList = sourceList.DistinctBy(x => x.FooName);
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector)
{
var knownKeys = new HashSet<TKey>();
return source.Where(element => knownKeys.Add(keySelector(element)));
}
Run Code Online (Sandbox Code Playgroud)
有Distinct()方法.它应该工作.
List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)
如果你想坚持使用原始的List而不是创建一个新的List,你可以使用类似于Distinct()
内部扩展方法的东西,即使用HashSet来检查唯一性:
HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));
Run Code Online (Sandbox Code Playgroud)
List类提供了这种方便的RemoveAll(predicate)
方法,可以删除所有不满足谓词指定条件的元素.谓词是一个委托,它接受列表元素类型的参数并返回一个bool值.Add()
仅当集合尚未包含项目时,HashSet的方法才返回true.因此,通过从列表中删除无法添加到集合中的任何项目,您可以有效地删除所有重复项.