问题描述
如题,在.NET/C#程序开发中,如何从一个泛型集合List<T>中删除重复的元素?
有哪些方式可以实现,哪种实现更好呢?
方案一
可以使用HashSet
来处理,如下:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
HashSet<int> evenNumbers = new HashSet<int>();
HashSet<int> oddNumbers = new HashSet<int>();
for (int i = 0; i < 5; i++)
{
// 填充偶数
evenNumbers.Add(i * 2);
// 填充奇数
oddNumbers.Add((i * 2) + 1);
}
Console.Write("偶数元素个数: {0}", evenNumbers.Count);
DisplaySet(evenNumbers);
Console.Write("奇数元素个数:{0}", oddNumbers.Count);
DisplaySet(oddNumbers);
// 创建一个新的HashSet来保存偶数元素
HashSet<int> numbers = new HashSet<int>(evenNumbers);
Console.WriteLine("连接奇数元素...");
numbers.UnionWith(oddNumbers);
Console.Write("所有元素集合:{0}", numbers.Count);
DisplaySet(numbers);
}
private static void DisplaySet(HashSet<int> set)
{
Console.Write("{");
foreach (int i in set)
{
Console.Write(" {0}", i);
}
Console.WriteLine(" }");
}
}
/* 输出结果:
* 偶数元素个数: { 0 2 4 6 8 }
* 奇数元素个数: { 1 3 5 7 9 }
* 连接奇数元素...
* 所有元素集合: { 0 2 4 6 8 1 3 5 7 9 }
*/
方案二
如果在.NET 3及以上版本,可以使用Linq
,如:
List<T> withDupes = LoadSomeData();
List<T> noDupes = withDupes.Distinct().ToList();
方案三
使用HashSet<T>
:
var noDupsList = new HashSet<T>(withDupes).ToList();
方案四
使用循环,来判断并移除重复的元素:
list.Sort();
Int32 index = 0;
while (index < list.Count - 1)
{
if (list[index] == list[index + 1])
list.RemoveAt(index);
else
index++;
}
方案五
public IEnumerable<T> DedupCollection<T> (IEnumerable<T> input)
{
var passedValues = new HashSet<T>();
foreach(T item in input)
if(passedValues.Add(item)) // True if item is new
yield return item;
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册