【问题标题】:Specify condition with FirstOrDefault (in Method Chaining Approach)使用 FirstOrDefault 指定条件(在方法链接方法中)
【发布时间】:2012-12-13 12:52:40
【问题描述】:

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

日期时间? latestPreferenceDate = preferences.FirstOrDefault() == null ? 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. Using "where": Cannot convert lambda expression to type 'bool'
  2. .NET LINQ query syntax vs method chain

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以从表格中获取最新日期,然后在您的情况下使用它。

    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));
    }
    }
    

    【讨论】:

    • @Lijo,你必须先计算最晚的日期,然后再获取记录。
    • @Lijo,你只需要最新日期吗?还是您想要与最新日期关联的对象
    【解决方案2】:
    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;
        }
    }
    

    【讨论】:

    • @Lijo 第二个例子就是这样做的;它选择与最新日期对应的对象。
    【解决方案3】:

    这样试试

       var data= preferences.Where(x=>x.CreatedDate !=null).
                      Orderby(x=>x.CreatedDate).
                      FirstOrDefault() ;
        if(data!=null)
          var date = data.CreatedDate;
    

    【讨论】:

    • 这个方法比@Habib 方法好。 (即,首先选择最大日期)?
    • @Lijo - 当你检查空值时,我喜欢使用这个而不是直接使用 max 方法......
    【解决方案4】:
    var c = preferences.OrderBy(x => x.CreatedDate).Reverse().FirstOrDefault();
    

    【讨论】:

      【解决方案5】:

      尝试如下,

      使用 MAX 查找 maxt CreatedDate。

      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 来获取最后一次出现。 p>

         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();
            }
      
          }
      

      如果您只想要具有最新日期的最后一项,请尝试使用以下代码:

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

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        相关资源
        最近更新 更多