如何使用C#中的LINQ从另一个列表生成唯一的项列表

时间:2009-10-02 15:45:07

标签: c# linq

我有一个像{One,Two,Three,One,Four,One,Five,Two,One}这样的项目列表,我需要一个查询来获取该列表,并根据唯一的项目生成一个列表,所以返回的列表将是{One,Two,Three,Four,Five}。

8 个答案:

答案 0 :(得分:17)

使用Distinct运算符:

var unique = list.Distinct();

答案 1 :(得分:5)

Distinct运算符。在MSDN上有一个例子。

http://msdn.microsoft.com/en-us/library/bb348436.aspx

答案 2 :(得分:3)

        var x = new string[] {"One", "Two", "Three", "One", "Four", "One", "Five", "Two", "One"}.ToList();
        var distinct = x.Distinct();

答案 3 :(得分:2)

值得注意的是,Distinct()将使用默认的确定相等的方法,如果您的列表包含复杂对象而不是基元,则可能不适合您。

有一个重载允许您指定IEqualityComparer以提供自定义相等逻辑。

有关Distinct如何确定两个项目是否相等的更多详细信息:http://msdn.microsoft.com/en-us/library/ms224763.aspx

答案 4 :(得分:1)

使用distinct

    List<string> l = new List<string>
    {
        "One","Two","Three","One","Four","One","Five","Two","One"
    };

    var rootcategories2 = l.Distinct();

答案 5 :(得分:1)

除了其他人提到的Distinct之外,您还可以使用HashSet:

List<string> distinct = new HashSet<string>(list).ToList();

如果您正在使用LINQ,请选择Distinct。

答案 6 :(得分:0)

感谢您的所有答案,我想我略微错误地提出了我的问题。我真正拥有的是一个复杂的类,我希望根据该类的特定成员进行比较(对于Distinct)。

class ComplexClass
{
    public string Name{ get; set; }
    public string DisplayName{ get; set; }
    public int ComplexID{ get; set; }
}

List<ComplexClass> complexClassList = new List<ComplexClass>();

complexClassList.Add(new ComplexClass(){Name="1", DisplayName="One", ComplexID=1});
complexClassList.Add(new ComplexClass(){Name="2", DisplayName="Two", ComplexID=2});
complexClassList.Add(new ComplexClass(){Name="3", DisplayName="One", ComplexID=1});

// This doesn't produce a distinct list, since the comparison is Default
List<ComplexClass) uniqueList = complexClassList.Distinct();

class ComplexClassNameComparer : IEquatable<ComplexClass>
{
    public override bool Equals(ComplexClass x, ComplexClass y)
    {
        return (x.To.DisplayName == y.To.DisplayName);
    }

    public override int GetHashCode(ComplexClass obj)
    {
        return obj.DisplayName.GetHashCode();
    }
}

// This does produce a distinct list, since the comparison is specific
List<ComplexClass) uniqueList = Enumerable.Distinct(complexClassList , new ComplexClassNameComparer());

答案 7 :(得分:0)

我遇到了类似的问题。我有一个 importItems 列表,其中 customerName 作为属性之一,我想从原始列表中生成一个唯一客户列表。

我将原始列表传递给 GenCustomers()...使用 linq 我创建了一个唯一的 itemCustomers 列表。然后我遍历该列表以创建一个新的客户列表。

public static List<Customer> GenCustomers(List<ImportItem> importItems)
{
    List<Customer> customers = new List<Customer>();

    var itemCustomers = importItems.Select(o => new { o.CustomerName }).Distinct();

    foreach (var item in itemCustomers)
    {
        customers.Add(new Customer() { CompanyName = item.CustomerName });
    }

    return customers;
}