Комплекс OrderBy в Линке - PullRequest
       4

Комплекс OrderBy в Линке

0 голосов
/ 25 апреля 2018

У меня есть список объекта DemoInfo со списком объекта StatInfo, как показано ниже -:

public class DemoInfo
{
  public string name;
  public List<StatInfo> stat;
  public string workLocation;
}

Далее StatInfo находится ниже объекта

public class StatInfo
{
  public string contact;
  public DateTime createdDate;
  public string action;
}

Мне нужно упорядочить списокDemoInfo by creatDate

Как это сделать в Linq?

1 Ответ

0 голосов
/ 25 апреля 2018

Ваша проблема в том, что у вас нет правильной спецификации

Мне нужно упорядочить список DemoInfo по дате создания

Вы не можете этого сделать, потому что DemoInfo не имеет CreatedDate. Если вы предполагаете, что DemoInfo был создан в тот день, когда он получил свой первый StatInfo, то вы можете использовать самый старый StatInfo для заказа:

Мне нужно упорядочить мою последовательность DemoInfo в порядке возрастания по дате ее создания, которая определяется как дата его самой старой StatInfo.

Это все еще имеет проблему: что такое CreatedDate DemoInfo после того, как все его StatInfos удалены? И удаление самого старого StatInfo из DemoInfo со многими StatInfos внезапно меняет CreatedDate из DemoInfo.

Но давайте предположим, что это не проблема для вас, и вы хотите, чтобы все DemoInfo без StatInfo последнего в вашем результате (потому что они получат свои CreationDate в будущем, когда он получит свой первый StatInfo. Ваш запрос будет выглядеть так:

var result = myDemoInfos.Select(demoInfo => new
    {
        DemoInfo = demoInfo,
        // if the demoInfo has a non-null stat and a non-empty stat
        // order it by ascending StatInfo.CreatedDate, and take the first
        // otherwise use DateTime.MaxValue (Created in far future)
        CreationDate = ( (demoInfo.stat != null) && (demoInfo.stat.Any()) ?
            demoInfo.Stat
                .Select(statInfo => createdDate)
                .OrderBy(createdDate => createdDate)
                .First() :             // you know there is a first, you just checked Any()
                DateTime.MaxValue,     // if there is no First, take far future
    })
    .OrderBy(item => item.CreationDate)
    .Select(item => item.DemoInfo);

Это может быть умнее: вам не нужно сортировать все созданные даты, вам нужна только созданная дата с наименьшим счетом TickCount:

TickCount = ( (demoInfo.stat != null) && (demoInfo.stat.Any()) ?
     demoInfo.stat.Select(statInfo => statInfo.createdDate.TickCount).Min() :
     DateTime.MaxValue.TickCount,

и сортировка по возрастанию TickCount

...