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 - Fatal编程技术网

C# 使用列表类型的类的属性以外的值创建新列表

C# 使用列表类型的类的属性以外的值创建新列表,c#,linq,C#,Linq,我有一个带有Id和Name属性的类Customers。创建客户列表后,我需要一个新的客户列表,该列表没有重复的名称,即客户。名称必须是唯一的。我的当前输出: Gustavo Gabriel Mariza Sandro Gustavo Gabriel Lilian Sandro 预期产出: Gustavo Gabriel Mariza Sandro Lilian 我尝试了这个,但我一直在犯一个与类型转换相关的错误: using System; using System.Collections.

我有一个带有
Id
Name
属性的类
Customers
。创建
客户
列表后,我需要一个新的
客户
列表,该列表没有重复的名称,即客户。名称必须是唯一的。我的当前输出:

Gustavo
Gabriel
Mariza
Sandro
Gustavo
Gabriel
Lilian
Sandro
预期产出:

Gustavo
Gabriel
Mariza
Sandro
Lilian
我尝试了这个,但我一直在犯一个与类型转换相关的错误:

using System;
using System.Collections.Generic;
using System.Linq;

namespace SelectDistinct
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Customers> customers = new List<Customers>();
            customers.Add(new Customers(0, "Gustavo"));
            customers.Add(new Customers(0, "Gabriel"));
            customers.Add(new Customers(0, "Mariza"));
            customers.Add(new Customers(0, "Sandro"));
            customers.Add(new Customers(0, "Gustavo"));
            customers.Add(new Customers(0, "Gabriel"));
            customers.Add(new Customers(0, "Lilian"));
            customers.Add(new Customers(0, "Sandro"));

            customers = customers.Select(x => x.Name.Distinct());

            customers.ToList().ForEach(x =>
            {
                Console.WriteLine(x.ToString());
            });
        }

        public class Customers
        {
            public int Id { get; set; }
            public string Name { get; set; }

            public Customers(int id, string name)
            {
                Id = id;
                Name = name;
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间SelectDistinct
{
公共课程
{
静态void Main(字符串[]参数)
{
列出客户=新列表();
添加(新客户(0,“Gustavo”);
添加(新客户(0,“加布里埃尔”);
添加(新客户(0,“Mariza”);
添加(新客户(0,“Sandro”);
添加(新客户(0,“Gustavo”);
添加(新客户(0,“加布里埃尔”);
添加(新客户(0,“丽莲”);
添加(新客户(0,“Sandro”);
customers=customers.Select(x=>x.Name.Distinct());
customers.ToList().ForEach(x=>
{
Console.WriteLine(x.ToString());
});
}
公共类客户
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共客户(整数id、字符串名称)
{
Id=Id;
名称=名称;
}
}
}
}

有人能帮忙吗?

您发布的代码中有很多错误

我注意到的第一件事是
.Distinct()
的错误位置。您已经将它放在select中,并放在
Name
变量之后,这是不符合逻辑的

第二件事是,您试图将
客户分配给
客户。选择(x=>x.Name.Distinct())
-类型为
IEnumerable
-类型为
列表的
客户
变量

现在,要实现所需的功能,必须正确使用
Distinct
扩展名,并将结果分配给正确的变量

以下是您的完整工作代码:

static void Main(string[] args)
{
    List<Customers> customers = new List<Customers>();
    customers.Add(new Customers(0, "Gustavo"));
    customers.Add(new Customers(0, "Gabriel"));
    customers.Add(new Customers(0, "Mariza"));
    customers.Add(new Customers(0, "Sandro"));
    customers.Add(new Customers(0, "Gustavo"));
    customers.Add(new Customers(0, "Gabriel"));
    customers.Add(new Customers(0, "Lilian"));
    customers.Add(new Customers(0, "Sandro"));

    IEnumerable<string> distinctNames = customers.Select(x=>x.Name).Distinct();

    distinctNames.ToList().ForEach(x =>
    {
        Console.WriteLine(x.ToString());
    });

    Console.ReadKey();
}

public class Customers
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Customers(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
static void Main(字符串[]args)
{
列出客户=新列表();
添加(新客户(0,“Gustavo”);
添加(新客户(0,“加布里埃尔”);
添加(新客户(0,“Mariza”);
添加(新客户(0,“Sandro”);
添加(新客户(0,“Gustavo”);
添加(新客户(0,“加布里埃尔”);
添加(新客户(0,“丽莲”);
添加(新客户(0,“Sandro”);
IEnumerable distinctNames=customers.Select(x=>x.Name).Distinct();
distinctNames.ToList().ForEach(x=>
{
Console.WriteLine(x.ToString());
});
Console.ReadKey();
}
公共类客户
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共客户(整数id、字符串名称)
{
Id=Id;
名称=名称;
}
}
以下是输出:


Distinct
方法使用默认的相等比较器。
您需要重载
Equals
GetHashCode
方法才能正常工作

public class Customers
{
    // your code here

    public override string ToString() => Id + " " + Name;

    public override bool Equals(object obj)
    {
        return obj is Customers customers &&
                Id == customers.Id &&
                Name == customers.Name;
    }

    public override int GetHashCode()
    {
        int hashCode = -1919740922;
        hashCode = hashCode * -1521134295 + Id.GetHashCode();
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name);
        return hashCode;
    }
}
公共类客户
{
//你的代码在这里
公共重写字符串ToString()=>Id+“”+名称;
公共覆盖布尔等于(对象对象对象)
{
返回obj是客户&&
Id==customers.Id&&
Name==customers.Name;
}
公共覆盖int GetHashCode()
{
int hashCode=-1919740922;
hashCode=hashCode*-1521134295+Id.GetHashCode();
hashCode=hashCode*-1521134295+EqualityComparer.Default.GetHashCode(名称);
返回哈希码;
}
}
使用可获得预期的结果

var结果=客户
.GroupBy(c=>c.Name)
.Select(g=>g.First())
.ToList();
result.ForEach(c=>Console.WriteLine(c.Name));
输出将如下所示

Gustavo
Gabriel
Mariza
Sandro
Lilian

使用方法与comparer@AlexanderPetrov-OP使用的是
Distinct
,只是不符合他们的要求。customers2是一个打字错误。它可以通过
GroupBy
完成。事实上,正如我在声明中所说,最终列表必须是客户列表,而不是字符串。我已经编辑了customers2,这是一个打字错误。@Costa.Gustavo嗯,我在你编辑/声明之前写我的答案。要实现所需的功能,您需要重写Equals函数,如果我没有弄错的话,还需要GetHashCode。@AlexanderPetrov它没有。我的代码(已删除)生成了一个
IEnumerable
,并且@Pavel的代码创建了OP想要的
列表。