使用FirstOrDefault指定条件(在方法链接方法中)

本文关键字:方法 链接 FirstOrDefault 条件 使用 | 更新日期: 2023-09-27 17:49:39

我有以下代码用于选择最新的Preference对象的CreatedDate。它使用FirstOrDefault从首选项集合中选择一个Preference对象。

日期时间?latestPreferenceDate=首选项。FirstOrDefault((==空?null:(preferences.FirstOrDefault(((.CreatedDate;

我们如何指定所选对象应该是具有最新创建日期的对象?此外,我需要选择与最新日期相对应的对象,以选择该对象的其他属性。

注:我正在寻找method chaining方法

代码

class Program
{
    static void Main()
    {
        Int16? test = null;
        string val = Convert.ToString(test);
        Collection<Preference> preferences = new Collection<Preference>();
        Preference pref1 = new Preference();
        pref1.CreatedDate = new DateTime(2011, 11, 11);
        pref1.PreferenceCode = 1;
        Preference pref2 = new Preference();
        pref2.CreatedDate = new DateTime(2012, 12, 12);
        pref2.PreferenceCode = 2;
        preferences.Add(pref1);
        preferences.Add(pref2);

        DateTime? latestPreferenceDate = preferences.FirstOrDefault() == null ? null : (preferences.FirstOrDefault()).CreatedDate;

    }

}
public class Preference
{
    public DateTime? CreatedDate { get; set; }
    public int PreferenceCode { get; set; }
}

参考

  1. 使用";其中":无法将lambda表达式转换为类型';bool'
  2. .NET LINQ查询语法与方法链

使用FirstOrDefault指定条件(在方法链接方法中)

您可以从表中获取LatestDate,然后在您的条件中使用它。

if(preferences != null)
{
 if(preferences.Count != 0)
 {
    var LatestDate = preferences.Max(r=> r.CreatedDate);
    var item = preferences.FirstOrDefault(r=> r.CreatedDate == LatestDate);
 }
}

或者在一行你可以做:

if(preferences != null)
{
 if(preferences.Count != 0)
 {
    var item = preferences.FirstOrDefault(r=> r.CreatedDate == 
                                          preferences.Max(t=> t.CreatedDate));
}
}

像这样尝试

   var data= preferences.Where(x=>x.CreatedDate !=null).
                  Orderby(x=>x.CreatedDate).
                  FirstOrDefault() ;
    if(data!=null)
      var date = data.CreatedDate;
DateTime? latestPreferenceDate = preferences.Max(p => p.CreatedDate)

此外,如果你想获得最新日期的偏好,你可以使用MoreLINQ(可从NuGet获得(扩展MaxBy:

var item = preferences.MaxBy(p => p.CreatedDate)

它是这样实现的(避免两次枚举序列(:

public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
    Func<TSource, TKey> selector)
{
    IComparer<TKey> comparer = Comparer<TKey>.Default;
    using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
    {
        if (!sourceIterator.MoveNext())                
            throw new InvalidOperationException("Sequence was empty");
        TSource max = sourceIterator.Current;
        TKey maxKey = selector(max);
        while (sourceIterator.MoveNext())
        {
            TSource candidate = sourceIterator.Current;
            TKey candidateProjected = selector(candidate);
            if (comparer.Compare(candidateProjected, maxKey) > 0)
            {
                max = candidate;
                maxKey = candidateProjected;
            }
        }
        return max;
    }
}
var c = preferences.OrderBy(x => x.CreatedDate).Reverse().FirstOrDefault();

试试下面的

使用MAX查找最大创建日期。

DateTime? latestPreferenceDate = null;
var LatestDate = preferences.Max(r=> r.CreatedDate);

现在查找CreatedDate=LatestDate的所有记录。

var items = preferences.Where(r=> r.CreatedDate !=null && r.CreatedDate == LatestDate);

如果有许多具有LatestDate的记录(您将获得多个具有LatestDate的项目(,则可以使用FirstOrDefault获取第一次出现,并使用LastorDefault

   if (items != null && items.Count > 0)
   {
      var first = items.FirstOrDefault();
      if (first != null)
      {
         latestPreferenceDate = first.CreateDate();
      }
      //For Last
      var last = items.FirstOrDefault();
      if (last != null)
      {
            latestPreferenceDate = last.CreatedDate();
      }
    }

如果你只想要最后一个有LatestDate的项目,那么试试下面的代码:

var item= preferences.Where(x=>x.CreatedDate !=null).
                  OrderbyDescending(x=>x.CreatedDate).
                  FirstOrDefault();
if (item != null)
{
   latestPreferenceDate  = item.CreatedDate;
}