linq查询从对象列表中返回不同的字段值

时间:2011-06-03 18:48:15

标签: c# linq

class obj
{
int typeID; //10 types  0-9 
string uniqueString; //this is unique
}

假设有一个包含100个obj元素的列表,但只有10个唯一的typeID 是否可以写一个LINQ查询从objs列表中返回10个唯一的int?

7 个答案:

答案 0 :(得分:120)

objList.Select(o=>o.typeId).Distinct()

答案 1 :(得分:41)

假设你想要完整的对象,但只希望通过typeID来处理清晰度,那么LINQ中没有任何东西可以让它变得简单。 (如果只是想要typeID值,那么很容易 - 使用Select投射到该Distinct,然后使用正常的var distinct = list.DistinctBy(x => x.typeID); 调用。)

MoreLINQ中,您可以使用DistinctBy运算符:

var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First());

这仅适用于LINQ to Objects。

你可以使用分组或查找,这有点烦人且效率低下:

{{1}}

答案 2 :(得分:13)

如果只想使用纯Linq,可以使用groupby:

List<obj> distinct =
  objs.GroupBy(car => car.typeID).Select(g => g.First()).ToList();

如果您希望在整个应用中使用方法:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (!seenKeys.Contains(keySelector(element)))
        {
            seenKeys.Add(keySelector(element));
            yield return element;
        }
    }
}
正如MoreLinq所做的那样

使用此方法仅使用Id属性查找不同的值,您可以使用:

var query = objs.DistinctBy(p => p.TypeId);

您可以使用多个属性:

var query = objs.DistinctBy(p => new { p.TypeId, p.Name });

答案 3 :(得分:6)

当然,请使用Enumerable.Distinct

鉴于obj(例如foo)的集合,您可以执行以下操作:

var distinctTypeIDs = foo.Select(x => x.typeID).Distinct();

答案 4 :(得分:2)

我认为这就是你要找的东西:

    var objs= (from c in List_Objects 
orderby c.TypeID  select c).GroupBy(g=>g.TypeID).Select(x=>x.FirstOrDefault());      

与此Returning a Distinct IQueryable with LINQ?

类似

答案 5 :(得分:2)

如果只想使用Linq,则可以覆盖等于 GetHashCode 方法。

产品类别:

public class Product
{
    public string ProductName { get; set; }
    public int Id { get; set; }


    public override bool Equals(object obj)
    {
        if (!(obj is Product))
        {
            return false;
        }

        var other = (Product)obj;
        return Id == other.Id;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

主要方法:

static void Main(string[] args)
    {

        var products = new List<Product>
        {
            new Product{ ProductName="Product 1",Id = 1},
            new Product{ ProductName="Product 2",Id = 2},
            new Product{ ProductName="Product 4",Id = 5},
            new Product{ ProductName="Product 3",Id = 3},
            new Product{ ProductName="Product 4",Id = 4},
            new Product{ ProductName="Product 6",Id = 4},
            new Product{ ProductName="Product 6",Id = 4},
        };

        var itemsDistinctByProductName = products.Distinct().ToList();

        foreach (var product in itemsDistinctByProductName)
        {
            Console.WriteLine($"Product Id : {product.Id} ProductName : {product.ProductName} ");
        }

        Console.ReadKey();
    }

答案 6 :(得分:1)

我想将特定数据绑定到下拉列表,它应该是不同的。 我做了以下事情:

List<ClassDetails> classDetails;
List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList();
ddlData.DataSource = classDetailsData;
ddlData.Databind();

看看是否有帮助