1

最新の Preference オブジェクトの CreatedDate を選択するための次のコードがあります。FirstOrDefault設定コレクションから 1 つの設定オブジェクトを選択するために使用します。

日付時刻?latestPreferenceDate = 設定.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. 「where」の使用: ラムダ式を「bool」型に変換できません
  2. .NET LINQ クエリ構文とメソッド チェーン
4

5 に答える 5

2

テーブルから LatestDate を取得し、それを条件で使用できます。

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

または、1行で次のことができます:

if(preferences != null)
{
 if(preferences.Count != 0)
 {

    var item = preferences.FirstOrDefault(r=> r.CreatedDate == 
                                          preferences.Max(t=> t.CreatedDate));
}
}
于 2012-12-28T07:56:17.043 に答える
1
DateTime? latestPreferenceDate = preferences.Max(p => p.CreatedDate)

また、最新の日付を優先したい場合は、MoreLINQ(NuGetから入手可能)拡張機能を使用できMaxByます。

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

これは次のように実装されます(シーケンスを2回列挙することを回避します)。

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;
    }
}
于 2012-12-28T07:56:53.097 に答える
1

このようにしてみてください

   var data= preferences.Where(x=>x.CreatedDate !=null).
                  Orderby(x=>x.CreatedDate).
                  FirstOrDefault() ;
    if(data!=null)
      var date = data.CreatedDate;
于 2012-12-28T08:00:44.010 に答える
1
var c = preferences.OrderBy(x => x.CreatedDate).Reverse().FirstOrDefault();
于 2012-12-28T08:11:11.797 に答える
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;
}
于 2012-12-28T08:25:45.770 に答える