2014-12-11 2 views
0

Я хочу, чтобы отсортировать следующий список тройного кортежа по T1 и T3 по возрастанию:Как отсортировать список <Tuple <T1, T2, T3>> по T1 и T3 восходящим

var datalist= new List<Tuple<long, string, string>>(); 
  • первыми: Сортировать по первому кортежу (длинный) по возрастанию
  • если есть записи с одинаковым номером (длинный), а затем сортировать в алфавитном порядке возрастания последнего кортежа (последняя строка)

Возможные отсортированный выход:

  • 123123, ххх, ZZ
  • 444555, YBC, аа
  • 444555, азбука, бб

С помощью этого кода а можно отсортировать список по первому кортежу (длинный), но не последним кортежа (последняя строка):

datalist.Sort((x, y) => x.Item1.CompareTo(y.Item1)); 
+3

Как насчет 'var sortedList = datalist.OrderBy (x => x.Item1) .ThenBy (x => x.Item3) .ToList()' –

ответ

3

x => y коротка для x => { return y; }.

Вместо одного заявления return тело может быть изменено, чтобы содержать все, что вам нравится.

datalist.Sort(
    (x, y) => { 
     var result = x.Item1.CompareTo(y.Item1); 
     if (result == 0) 
     result = x.Item3.CompareTo(y.Item3); 
     return result; 
    }); 
2

Использование OrderBy и ThenBy сочетание:

var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3); 
+0

Исправлено сохранение результата. –

1

Вы можете использовать Linq для его решения. Сначала добавьте пространство имен:

using System.Linq; 

Затем с помощью OrderBy и ThenBy, для образца:

var result = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3); 

Если вам нужно отсортировать в descending порядке, вы также можете увидеть OrderByDescending и TheByDescending.

Вы можете позвонить в OrderBy и посетить многие TheBy.

1

Вы можете использовать OrderBy() и ThenBy() функции System.Linq.

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     var datalist= new List<Tuple<long, string, string>>(); 
     datalist.Add(new Tuple<long, string, string>(123123, "xxx", "zz")); 
     datalist.Add(new Tuple<long, string, string>(444555, "ybc", "bb")); 
     datalist.Add(new Tuple<long, string, string>(444555, "abc", "aa")); 
     datalist = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3).ToList(); 
     foreach(var data in datalist) 
     { 
      Console.WriteLine("{0} {1} {2}", data.Item1,data.Item2, data.Item3); 
     } 
    } 
} 

https://dotnetfiddle.net/LNYCjA

5

Вам просто нужно сделать второе сравнение в тех случаях, когда первые результаты в эквивалентности:

datalist.Sort((x, y) => { 
    var cmp = x.Item1.CompareTo(y.Item1); 
    return cmp == 0 ? x.Item3.CompareTo(y.Item3) : cmp; 
}); 

В качестве альтернативы можно использовать OrderBy с последующим ThenBy и ToList, чтобы поместить их в списке снова; это довольно расточительно, когда у вас уже есть список и не будете использовать оригинальный заказ на что-то другое, но это чуть более выразительный:

datalist = datalist.OrderBy(x => x.Item1).ThenBy(x => x.Item3).ToList(); 

Конечно, стоимость такого расхода возрастает как с размером datalist и как часто эта операция будет выполнена.

С другой стороны, если вы собираетесь только перечислить этот один раз, то омение ToList() уменьшит эту стоимость, поскольку новый список не создается, и если ваше перечисление может выйти до полного цикла (например, после нахождения некоторые элементы, которые соответствуют заданным критериям), тогда это может быть даже более эффективным, чем первый подход.

Смежные вопросы