Список интерфейса сортировки C # - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь отсортировать список интерфейсов по дате, но не могу понять.

var agencyList = new List<INewsItemBE>();

var item = new News1BE();
//add items
agencyList.Add(item)

var item = new News2BE();
//add items
agencyList.Add(item);

После добавления элементов я хочу отсортировать agencyList по дате с чем-то вроде этого, но яне могу заставить его работать.

agencyList.Sort(delegate (News1BE c1, News1BE c2) { return c1.PublishDate.CompareTo(c2.PublishDate); });

agencyList.Sort(delegate (News1BE a, News1BE b) => a.PublishDate.CompareTo(b.PublishDate));
agencyList = agencyList.OrderBy(x => cant find anything at x.).ToList();

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вы можете использовать SortedList вместо List, чтобы он автоматически сортировался при добавлении элементов.

Определите ваши классы / интерфейсы:

interface INews1BE
{
    DateTime PublishedDate { get; set; }
}

class News1BE : INews1BE
{
    public DateTime PublishedDate { get; set; }
}

Определите компаратор для DateTime:

class DateTimeAscendingComparer : IComparer<DateTime>
{
    public int Compare(DateTime a, DateTime b)
    {
        return a.CompareTo(b);
    }
}

Теперь создайте компаратор и отсортированный список, передавая компаратор конструктору SortedList:

var comparer = new DateTimeAscendingComparer();
var sortedList = new SortedList<DateTime, INews1BE>(comparer);

Добавьте некоторые элементы и проверьте результаты:

var item1 = new News1BE() 
{
    PublishedDate = DateTime.Now
};

var item2 = new News1BE()
{
    PublishedDate = item1.PublishedDate.AddSeconds(-30)
};

sortedList.Add(item1.PublishedDate, item1);

//item2 goes before item1
sortedList.Add(item2.PublishedDate, item2);

foreach(var x in sortedList)
{
    Console.WriteLine(x.Key);
}

Вы также можете получить доступваш объект через Value:

foreach (var x in sortedList)
{
    Console.WriteLine(x.Value.PublishedDate);
}

Или вы можете перебрать значения, чтобы получить немедленный доступ к вашему объекту INews1BE:

foreach(var x in sortedList.Values)
{
    Console.WriteLine(x.PublishedDate);
}

На самом деле вам не нужно определять компаратор для DateTime, есливы просто заботитесь о порядке возрастания - это поведение по умолчанию, поэтому вы можете просто создать SortedList, не передавая компаратор конструктору:

var sortedList = new SortedList<DateTime, INews1BE>();

Но если вам нужен порядок убывания, просто переключите DateTime a с DateTime b при сравнении:

class DateTimeDescendingComparer : IComparer<DateTime>
{
    public int Compare(DateTime a, DateTime b)
    {
        return b.CompareTo(a);
    }
}
0 голосов
/ 18 мая 2018

Попробуйте LINQ:

using System.Linq;

var ordered = agencyList.OrderBy(x => x.PublishDate);

Или, если вам нужно, по убыванию:

var orderedDesc = agencyList.OrderByDescending(x => x.PublishDate);

, если вам снова нужен список в исходной переменной, вы можете вызвать .ToList():

agencyList = agencyList.OrderBy(x => x.PublishDate).ToList();

Если LINQ не работает для вас (или вы хотите добиться максимальной производительности и, следовательно, снизить накладные расходы, вызванные LINQ), вы можете использовать метод .Sort, который вы пытались:

agencyList.Sort((item1, item2) => item1.PublishDate.CompareTo(item2.PublishDate));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...