我有一个像{One,Two,Three,One,Four,One,Five,Two,One}这样的项目列表,我需要一个查询来获取该列表,并根据唯一的项目生成一个列表,所以返回的列表将是{One,Two,Three,Four,Five}。
答案 0 :(得分:17)
使用Distinct运算符:
var unique = list.Distinct();
答案 1 :(得分:5)
Distinct运算符。在MSDN上有一个例子。
答案 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;
}