我有以下课程:
class Product
{
public string ProductName { get; set; }
public DateTime ActivationDate { get; set; }
}
然后我创建并填充List<Product>
,我希望ProductName
获取最新Product
的{{1}}。
ActivationDate
但是bot方法不起作用。有人知道实现这项任务的方法吗?
答案 0 :(得分:6)
您可以在ActivationDate字段上OrderByDescending
List<Product>
,然后点FirstOrDefault()
Product.OrderByDescending(p => p.ActivationDate).FirstOrDefault();
对于更简单的版本,有一种扩展方法
Product.MaxBy(p => p.ActivationDate);
答案 1 :(得分:4)
如果你能做到这一点:
class Product : IComparable<Product>
{
public string ProductName { get; set; }
public DateTime ActivationDate { get; set; }
public int CompareTo(Product other)
{
return this.ActivationDate.CompareTo(other.ActivationDate);
}
}
然后就是这样:
var max = products.Max(p => p).ProductName;
答案 2 :(得分:2)
我们走了;列表的一次传递:
public static TSource MaxBy<TSource,TValue>(
this IEnumerable<TSource> source,
Func<TSource,TValue> selector)
{
using(var iter = source.GetEnumerator())
{
if (!iter.MoveNext())
throw new InvalidOperationException("Empty sequence");
var max = selector(iter.Current);
var item = iter.Current;
var comparer = Comparer<TValue>.Default;
while(iter.MoveNext())
{
var tmp = selector(iter.Current);
if(comparer.Compare(max, tmp) < 0)
{
item = iter.Current;
max = tmp;
}
}
return item;
}
}
然后:
var maxObj = list.MaxBy(x => x.SomeProp);
这比执行OrderBy
更有效,例如,它需要实际排序数据,而不是只扫描一次。
答案 3 :(得分:0)
非LINQ解决方案很简单,如果您只在一个地方需要它,那么通用MaxBy将是一种过度杀伤:
Product max_product = null;
foreach (var product in products) {
if (max_product == null || max_product.ActivationDate < product.ActivationDate)
max_product = product;
}
// Use `max_product`...
答案 4 :(得分:0)
如何编写一个名为Max的扩展函数,它在内部执行Branko Dimitrijevic提供的简单搜索逻辑。
/// <param name="comparer">Func<T current, T currentMax, long> </param>
public static T Max<T>(this List<T> collection, Func<T, T, long> comparer) where T : class
{
T max_product = null;
collection.ForEach(c =>
{
if (max_product == null || comparer(c, max_product) > 0)
max_product = c;
});
return max_product;
}
将此功能称为:
string maxProductName = products.Max<Product>((currentProduct, currentMaxProduct) =>
{
// Basically any logic
return currentMaxProduct.ActivationDate.CompareTo(currentProduct.ActivationDate);
}).ProductName;
答案 5 :(得分:-2)
试试这个
ProductList.Where(m => m.ActivationDate == ProductList.Max(pl => pl.ActivationDate)).FirstOrDefault().ProductName;