首页 / C#开发 / 正文

[LINQ].NET/C#应用程序开发中如何使用LINQ实现查询集合List<T>中属性某个属性最大值的实体对象?

7376 发布于: 2018-04-17 读完约需8分钟

问题描述

在.NET/C#的应用程序开发中,有如下的实体对象:

public class Item
{
    public int ClientID { get; set; }
    public int ID { get; set; }
}

和一个关于Item实现对象的集合List<Item>

List<Item> items = getItems();

其中的getItems()是获取数据集合List<Item>的方法。

如何使用LINQ来实现从List<Item>集合中查询Item属性ID最大的那个对象呢?
使用如下的方法:

items.Select(i => i.ID).Max();

只能获取到最大的ID值,但这里需要查询最大ID值对应的实体对象。
那么,在.NET/C#应用程序开发中如何使用LINQ实现查询集合List<T>中属性某个属性最大值的实体对象?

方案一

使用LINQAggregate(...)方法,如下:

Item biggest = items.Aggregate((i1,i2) => i1.ID > i2.ID ? i1 : i2);

完整的示例,如下:

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<Item> items1 = new List<Item>()
        {
            new Item(){ ClientID = 1, ID = 1},
            new Item(){ ClientID = 2, ID = 2},
            new Item(){ ClientID = 3, ID = 3},
            new Item(){ ClientID = 4, ID = 4},
        };
        Item biggest1 = items1.Aggregate((i1, i2) => i1.ID > i2.ID ? i1 : i2);

        Console.WriteLine(biggest1.ID);
        Console.ReadKey();
    }


}

public class Item
{
    public int ClientID { get; set; }
    public int ID { get; set; }
}

方案二

使用LINQOrderByDescending()方法,如下:

.OrderByDescending(i=>i.id).Take(1)

方案三

借助第三方关于LINQ的组件,MoreLINQ,如下:

items.MaxBy(i => i.ID);

方案四

创建一个静态扩展方法,如下:

public static T MaxBy(this IEnumerable<T> items, Func<T, int> f) {
  return items.Aggregate(
    new { Max = Int32.MinValue, Item = default(T) },
    (state, el) => {
      var current = f(el.ID);
      if (current > state.Max) 
        return new { Max = current, Item = el };
      else 
        return state; 
    }).Item;
}

方案五

另外一个静态扩展类和静态扩展方法,如下:

static partial class Extensions
{
    public static T WhereMax<T, U>(this IEnumerable<T> items, Func<T, U> selector)
    {
        if (!items.Any())
        {
            throw new InvalidOperationException("Empty input sequence");
        }

        var comparer = Comparer<U>.Default;
        T   maxItem  = items.First();
        U   maxValue = selector(maxItem);

        foreach (T item in items.Skip(1))
        {
            U value = selector(item);
            if (comparer.Compare(value, maxValue) > 0)
            {
                maxValue = value;
                maxItem  = item;
            }
        }

        return maxItem;
    }
}

方案六

基于LINQ表达式的查询实现,如下:

Item itemMax = (from i in items
     let maxId = items.Max(m => m.ID)
     where i.ID == maxId
     select i).FirstOrDefault();

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [LINQ].NET/C#开发中如何使用LINQ实现SQL查询语句中的GROUP BY HAVING COUNT查询?

下一篇: [Entity Framework].NET/C#应用程序开发中如何查看EF(Entity Framework)生成的SQL语句?

本文永久链接码友网 » [LINQ].NET/C#应用程序开发中如何使用LINQ实现查询集合List<T>中属性某个属性最大值的实体对象?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册