Как отсортировать список <List <string>> по списку <string>по количеству полей? - PullRequest
2 голосов
/ 06 апреля 2009

Как отсортировать список > по количеству полей?

Список получил структуру типа

a|b|c|d|eeee|rere|ewew|
ewqewq|ewew|
ewew|ewewewewew|

По сортировке я бы хотел сделать это по количеству блоков (asc / desc)

EDIT

<list<list<string>> is "items" и я получаю доступ к каждому списку по пунктам [0] каждого из

Эти элементы [xx] - это список, который означает, что я хочу, чтобы они отсортировали массив по

    a|b|c|d|eeee|rere|ewew|
    a|b|c|d|eeee|rere
    a|b|c|d|eeee

Ответы [ 5 ]

9 голосов
/ 06 апреля 2009

Если вам не нужно сортировать «на месте», вы можете использовать LINQ, чтобы дать вам новый отсортированный список.

var sorted = oldList.OrderBy( l => l.Count );

В противном случае вам нужно написать свой собственный Comparer, который берет два списка и возвращает порядок их размера.

public class CountComparer : IComparer<List<string>>
{
    #region IComparer<List<string>> Members

    public int Compare( List<string> x, List<string> y )
    {
        return x.Count.CompareTo( y.Count );
    }

    #endregion
}



oldList.Sort( new CountComparer() );

Или, как указывает @Josh, вы можете сделать это с помощью лямбда-выражения.

oldList.Sort( (a,b) => a.Count.CompareTo( b.Count ) )

IMO, этот последний работает хорошо, если сравнение относительно простое или используется один раз, но реальный класс может быть предпочтительнее, так как сравнение становится более сложным или если вам нужно повторить его в нескольких местах.

3 голосов
/ 06 апреля 2009
List<List<string>> list; // filled elsewhere
list.Sort((x,y) => x.Count.CompareTo(y.Count););
1 голос
/ 06 апреля 2009

Вы можете сортировать, используя метод сортировки, создав свой собственный Compararer или присвоив ему делегат типа Comparison<T>.

ls.Sort((x, y) => x.Count.CompareTo(y.Count));

Вот пример, показывающий, как сравнивать, используя лямбда-выражение.

Редактировать

Очень простой способ изменить сортировку - это умножить на минус -1

ls.Sort((x, y) => -1 * x.Count.CompareTo(y.Count));
1 голос
/ 06 апреля 2009
List<List<string>> strings = new List<List<string>>();

// add your strings

strings = new List<List<string>>(from str in strings orderby str.Count select str);

Очевидно, что вы можете адаптировать это для вашего сценария, но это должно дать вам общее представление о том, как создать список, отсортированный по количеству элементов в определенной строке в другом списке.

0 голосов
/ 25 февраля 2013

Просто незначительная корректировка, проверка на ноль, а также

        List<List<string>> listOfLists = new List<List<string>>();

        List<string> list1 = new List<string>();
        list1.Add("elem 1 1");
        list1.Add("elem 1 2");
        list1.Add("elem 1 3");

        List<string> list2 = new List<string>();
        list2.Add("elem 2 1");
        list2.Add("elem 2 2");
        list2.Add("elem 2 3");
        list2.Add("elem 2 4");

        listOfLists.Add(list1);
        listOfLists.Add(null); // list can contain nulls
        listOfLists.Add(list2);
        listOfLists.Add(null); // list can contain nulls

Если в списке списков есть нулевые списки, вы можете сделать их более низкими по сравнению с пустыми списками, интерпретируя null.Count как -1 или НЕ

        int nullListElems = -1; 
        //int nullListElems = 0; 

        listOfLists.Sort((l1,l2)=> 
            l1 == null ? 
            nullListElems : 
            l1.Count.CompareTo(
                l2 == null ? 
                nullListElems : 
                l2.Count));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...