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想要的列表。