2012-12-28 29 views
1

我有以下用于选择最新的Preference对象的CreatedDate的代码。它使用FirstOrDefault从首选项集合中选择一个首选项对象。使用FirstOrDefault指定条件(在方法链接方法中)

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

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

注:我在寻找一个method chaining方法

CODE

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

回答

1

您可以从表格中获取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)); 
} 
} 
+0

@Lijo,你必须先计算出最新的日期,然后拿到创纪录的反对。 – Habib

+0

@Lijo,你只需要最新的日期?或者你想要的对象与最新的日期 – Habib

1
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; 
    } 
} 
+1

@Lijo第二个例子完全是这样的;它选择与最近日期对应的对象。 – phoog

1

尝试这样

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

这种方法比@Habib方法更好。 (即先选择最大日期)? – Lijo

+1

@Lijo - 正如你要检查空值,我喜欢去这个,而不是直接用max方法去...... –

1
var c = preferences.OrderBy(x => x.CreatedDate).Reverse().FirstOrDefault(); 
0

尝试像下面,

使用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去年发生多条记录。

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