从C#中的列表中选择唯一元素

时间:2008-11-15 08:21:29

标签: c# list

如何从列表{0, 1, 2, 2, 2, 3, 4, 4, 5}中选择唯一元素,以便获得{0, 1, 3, 5},有效删除重复元素{2, 4} 的所有实例?< / p>

9 个答案:

答案 0 :(得分:31)

var numbers = new[] { 0, 1, 2, 2, 2, 3, 4, 4, 5 };

var uniqueNumbers =
    from n in numbers
    group n by n into nGroup
    where nGroup.Count() == 1
    select nGroup.Key;

// { 0, 1, 3, 5 }

答案 1 :(得分:16)

var nums = new int{ 0...4,4,5};
var distinct = nums.Distinct();

确保您使用的是Linq和.NET framework 3.5。

答案 2 :(得分:12)

使用lambda ..

var all = new[] {0,1,1,2,3,4,4,4,5,6,7,8,8}.ToList();
var unique = all.GroupBy(i => i).Where(i => i.Count() == 1).Select(i=>i.Key);

答案 3 :(得分:10)

C#2.0解决方案:

static IEnumerable<T> GetUniques<T>(IEnumerable<T> things)
{
    Dictionary<T, int> counts = new Dictionary<T, int>();

    foreach (T item in things)
    {
        int count;
        if (counts.TryGetValue(item, out count))
            counts[item] = ++count;
        else
            counts.Add(item, 1);
    }

    foreach (KeyValuePair<T, int> kvp in counts)
    {
        if (kvp.Value == 1)
            yield return kvp.Key;
    }
}

答案 4 :(得分:8)

如果列表中有复杂的类型对象并希望获取属性的唯一值,这是另一种方法:

var uniqueValues= myItems.Select(k => k.MyProperty)
                  .GroupBy(g => g)
                  .Where(c => c.Count() == 1)
                  .Select(k => k.Key)
                  .ToList();

或者获得不同的值:

var distinctValues = myItems.Select(p => p.MyProperty)
                            .Distinct()
                            .ToList();

如果您的属性也是复杂类型,您可以为Distinct()创建自定义比较器,例如Distinct(OrderComparer),其中OrderComparer可能如下所示:

public class OrderComparer : IEqualityComparer<Order>
{
    public bool Equals(Order o1, Order o2)
    {
        return o1.OrderID == o2.OrderID;
    }

    public int GetHashCode(Order obj)
    {
        return obj.OrderID.GetHashCode();
    }
}

答案 5 :(得分:3)

如果您无法使用Linq,因为您必须支持无法升级的遗留代码,请声明一个Dictionary,其中第一个int是数字,第二个int是出现的数量。循环浏览列表,加载字典。完成后,循环遍历“词典”,仅选择出现次数为1的元素。

答案 6 :(得分:3)

我相信马特的意思是:

 static IEnumerable<T> GetUniques<T>(IEnumerable<T> things)
 {
     Dictionary<T, bool> uniques = new Dictionary<T, bool>();
     foreach (T item in things)
     {
         if (!(uniques.ContainsKey(item)))
         {
             uniques.Add(item, true);
         }
     }
     return uniques.Keys;
 }

答案 7 :(得分:2)

有许多方法可以为猫提供皮肤,但HashSet似乎是为了完成这项任务。

var numbers = new[] { 0, 1, 2, 2, 2, 3, 4, 4, 5 };

HashSet<int> r = new HashSet<int>(numbers);

foreach( int i in r ) {
    Console.Write( "{0} ", i );
}

输出:

0 1 2 3 4 5

答案 8 :(得分:0)

在.Net 2.0中我很确定这个解决方案:

public IEnumerable<T> Distinct<T>(IEnumerable<T> source)
{
     List<T> uniques = new List<T>();
     foreach (T item in source)
     {
         if (!uniques.Contains(item)) uniques.Add(item);
     }
     return uniques;
}