问题描述
在.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>中属性某个属性最大值的实体对象?
方案一
使用LINQ
的Aggregate(...)
方法,如下:
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; }
}
方案二
使用LINQ
的OrderByDescending()
方法,如下:
.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();
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册