Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中使用LINQ从另一个列表生成唯一的项目列表#_C#_Linq - Fatal编程技术网

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

C# 如何在C中使用LINQ从另一个列表生成唯一的项目列表#,c#,linq,C#,Linq,我有一个类似于{1,2,3,1,4,1,5,2,1}的项目列表,我需要一个查询来获取该列表并生成一个仅基于唯一项目的列表,因此返回的列表将是{1,2,3,4,5}。使用操作符: var unique = list.Distinct(); 独立运算符。MSDN有一个例子 使用 List l=新列表 { “一”、“二”、“三”、“一”、“四”、“一”、“五”、“二”、“一” }; var rootcategories2=l.Distinct(); 除了其他人提到的Distinct之外,您还可以使用

我有一个类似于{1,2,3,1,4,1,5,2,1}的项目列表,我需要一个查询来获取该列表并生成一个仅基于唯一项目的列表,因此返回的列表将是{1,2,3,4,5}。

使用操作符:

var unique = list.Distinct();

独立运算符。MSDN有一个例子

使用

List l=新列表
{
“一”、“二”、“三”、“一”、“四”、“一”、“五”、“二”、“一”
};
var rootcategories2=l.Distinct();

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

List<string> distinct = new HashSet<string>(list).ToList();
List distinct=newhashset(List).ToList();
但是,如果您使用LINQ,请使用Distinct。

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

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


关于如何区分决定两个项目是否相等的更多细节:

谢谢你的回答,我想我的问题有点提错了。我真正拥有的是一个复杂的类,我希望基于该类的特定成员进行比较(对于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());
类ComplexClass
{
公共字符串名称{get;set;}
公共字符串DisplayName{get;set;}
公共整数复杂度{get;set;}
}
List complexClassList=新列表();
添加(新的ComplexClass(){Name=“1”,DisplayName=“1”,ComplexID=1});
添加(新的ComplexClass(){Name=“2”,DisplayName=“2”,ComplexID=2});
添加(新的ComplexClass(){Name=“3”,DisplayName=“一”,ComplexClass=1});
//这不会产生一个不同的列表,因为比较是默认的

List我也有类似的问题。我有一个以customerName作为属性之一的importItems列表,并希望从原始列表生成一个唯一客户列表

我将原始列表传递给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;
}
公共静态列表GenCustomers(列表importItems)
{
列出客户=新列表();
var itemcusters=importItems.Select(o=>new{o.CustomerName}).Distinct();
foreach(itemCustomers中的var项目)
{
添加(新客户(){CompanyName=item.CustomerName});
}
返回客户;
}

感谢那些已经指出这一点的人以及Hashset的建议。将Distinct与自定义IEqualityComparer比较器一起使用是可行的。您应该编辑原始问题,而不是发布答案。因此将提示您执行此操作。您的
ComplexClassComparer
Equals
GetHashCode
的实现之间存在差异。确保返回的值始终一致,这在目前并不明显
GetHashCode
应该返回
obj.To.DisplayName.GetHashCode()
。谢谢Kirk,但是,在这种情况下,我觉得回答比编辑问题和使所有答案无效更准确。谢谢Konrad,答案已经编辑好了。我的错误,复制/粘贴错误潜入。
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());
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;
}