Подтвердить что ты не робот

LINQ- Объединение нескольких списков <T> и порядок по значению (.Net 3.5)

Я пытаюсь объединить несколько List<T> where T:IGetTime (i.e T всегда будет иметь метод getTime()).

Затем я пытаюсь упорядочить элементы DateTime, возвращаемые getTime().

Мой LINQ выглядит так:

public static List<T> Combine(List<T> one, List<T> two, List<T> three)
    {
        var result = from IGetTime item in one
                     from IGetTime item2 in two
                     from IGetTime item3 in three
                     select new{ item, item2, item3 };

        return result.ToList();
    }

Мне еще нужно добавить orderby. Что должно выглядеть примерно так:

var thestream = from T item in this
                orderby item.getTime() descending
                select item;

Есть ли все равно, чтобы объединить и упорядочить окончательный список?

Спасибо заранее,

Роберто

4b9b3361

Ответ 1

У вас есть три списка: что именно вы пытаетесь заказать?

Ваш состав также неверен - результат будет IEnumerable<X>, где X является анонимным типом с тремя T in.

Если идея состоит в том, чтобы объединить три списка и затем отсортировать, вы хотите:

return one.Concat(two)
          .Concat(three)
          .OrderByDescending(x => x.GetTime())
          .ToList();

Ответ 2

Вот как бы я это сделал:

public static List<T> Combine<T, TKey>
(
  Func<T, TKey> orderingFunction,
  params IEnumerable<T>[] theParams
)
  where TKey : IComparable
{
  return theParams
    .SelectMany(x => x)
    .OrderBy(orderingFunction)
    .ToList();
}

Вот несколько тестовых кодов:

    public static void Test1()
    {
        List<int> a = new List<int>() { 1, 2, 3 };
        List<int> b = new List<int>() { 3, 2, 1 };
        List<int> c = CombineLists.Combine(i => i, a, b);
        c.ForEach(i => Console.WriteLine(i));
    }

Вот история:

public static List<T> Combine<T, TKey>
(
  Func<T, TKey> orderingFunction,
  params IEnumerable<T>[] theParams
)
  where TKey : IComparable

Эта подпись объявляет метод, который принимает два параметра типа, некоторую функцию упорядочения и набор коллекций. Обратите внимание, что типы T и TKey не указаны явно в тестовом вызове. У компилятора есть небольшая загадка, чтобы понять, что это за типы. Сначала он проверяет IEnumerables, что он был дан (a и b), и обнаруживает, что они IEnumerable из int. Aha, T должен быть int. Затем он проверяет функцию заказа и видит, что он возвращает тот же самый тип, который передается. Aha, TKey должен быть int.

Где смешно. OrderBy должен проверить (во время компиляции), что TKey является IComparable. Он проверяет только во время выполнения, поэтому мы можем выполнить проверку времени компиляции в нашем коде.

params принимает столько параметров, сколько вам нравится, и ссылается на них, создавая массив. Кто хочет ограничиться тремя списками?

        return theParams
            .SelectMany(x => x)
            .OrderBy(orderingFunction)
            .ToList();

SelectMany распаковывает коллекцию коллекций. Это способ сгладить один уровень иерархии. OrderBy принимает некоторую функцию, которая проектирует каждый элемент к упорядочиваемому значению и упорядочивает элементы в соответствии с этими значениями. ToList перечисляет запрос и возвращает список. Никаких сюрпризов нет.