Определите условие с FirstOrDefault (в Методе, Приковывающем Подход цепью)

У меня есть следующий код для отбора последнего Предпочтительного объекта CreatedDate. Это использует FirstOrDefault , чтобы выбрать один Предпочтительный объект из предпочтительной коллекции.

DateTime? latestPreferenceDate = предпочтения. FirstOrDefault() == пустой указатель? пустой указатель: (предпочтения. FirstOrDefault ()).CreatedDate;

Как мы можем определить, что выбранный объект должен быть тем с последней Созданной Датой? Кроме того, я должен выбрать объект, соответствующий последней дате отбора других свойств этого объекта.

Примечание: Я ищу формирование цепочки метода подход

КОДЕКС

class Program
{
    static void Main()
    {
        Int16? test = null;
        string val = Convert.ToString(test);

        Collection preferences = new Collection();

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

REFERENCES:

  1. Using "where": Cannot convert lambda expression to type 'bool'
  2. .NET LINQ query syntax vs method chain
1

5 ответы

попробуйте как это

   var data= preferences.Where(x=>x.CreatedDate !=null).
                  Orderby(x=>x.CreatedDate).
                  FirstOrDefault() ;
    if(data!=null)
      var date = data.CreatedDate;
1
добавлено
Этот метод лучше, чем @Habib метод. (т.е., выбирая макс. дату сначала)?
добавлено автор Lijo, источник
@Lijo - как вы ahve, чтобы проверить на нулевое значение мне нравится идти с этим, а не идти с макс. методом direcly...
добавлено автор Pranay Rana, источник

Можно достать 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));
}
}
1
добавлено
@Lijo, необходимо вычислить последнюю дату сначала и затем получить отчет против него.
добавлено автор Habib, источник
@Lijo, вам просто нужно на последнюю дату? или вы хотите объект, связанный с последней датой
добавлено автор Habib, источник
DateTime? latestPreferenceDate = preferences.Max(p => p.CreatedDate)

Также, если вы хотите получить предпочтение с последней датой, можно использовать MoreLINQ (доступный от NuGet) расширение MaxBy :

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

Это осуществляется этот путь (старается не перечислять последовательность дважды):

public static TSource MaxBy(this IEnumerable source,
    Func selector)
{
    IComparer comparer = Comparer.Default;
    using (IEnumerator 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, источник
var c = preferences.OrderBy(x => x.CreatedDate).Reverse().FirstOrDefault();
1
добавлено

Попробуйте как ниже,

Используйте МАКСА, чтобы найти 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;
}
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot