c # сортировка списка по номеру - PullRequest
1 голос
/ 19 ноября 2011

У меня есть список полей, которые пользователь может сортировать с помощью jquery.Я сохраняю эти обновленные поля в базе данных.Эти же поля можно добавлять и удалять из отчета, поэтому в некоторых случаях у меня будет field1, field55, field 3.Поля могут отображаться в случайном порядке (в зависимости от того, где он отображается в отчете).

Я пытаюсь отсортировать список, в котором в большинстве случаев поле будет иметь значение, но оно также может быть равно 0.

var list = Dictionary<string,int>(); //loaded from the client side, in-memory

У меня есть список, в котором я использую метод list.orderby(x=> x.Value); Это позволит отсортировать поля в правильном порядке, однако я хочу получить оставшиеся поля, чей порядок = 0, и добавить в конец спискас наибольшим числом в списке.

например, самое большое число в списке - 78, у меня есть 4 поля, у которых Пропорция порядка = 0, эти поля должны быть 79,80,81,82 соответственно.

Нечто подобное может работать, но я получаю сообщение об ошибке изменения коллекции:

        var max = list.Max(x => x.Value);

        foreach (var item in list.Where(x => x.Value == 0))
        {
            list[item.Key] = ++max;
        }

Ответы [ 4 ]

1 голос
/ 19 ноября 2011
var list = new Dictionary<string, int>
    {
        {"Banana", 123},
        {"Apple", 234},
        {"Orange", 34},
        {"Pear", 4},
        {"Elephant", 99},
        {"UnOrderedItem1", 0},
        {"UnOrderedItem2", 0},
        {"UnOrderedItem3", 0},
        {"UnOrderedItem4", 0},
    };

int nextValue = list.Max(x => x.Value) + 1;
var elementsWithZero = (from l in list where l.Value == 0 select l)
    .ToList();

foreach (var item in elementsWithZero)
{
    list[item.Key] = nextValue++;
}

var sortedList = (from l in list select l)
    .OrderBy(x => x.Value);

foreach (var item in sortedList)
{
    Console.WriteLine("{0}: {1}", item.Value, item.Key);
}

Выход:

4: Pear
34: Orange
99: Elephant
123: Banana
234: Apple
235: UnOrderedItem1
236: UnOrderedItem2
237: UnOrderedItem3
238: UnOrderedItem4
0 голосов
/ 19 ноября 2011

Вы можете создать свой собственный Comparer как этот

list.OrderBy(new FieldDTOComparer());

private class FieldDTOComparer : IComparer<FieldDTO>
{
    public int Compare(FieldDTO x, FieldDTO y)
    {
        if (x.Order == 0)
            return 1;
        if (y.Order == 0)
            return -1;
        return x.Order - y.Order;
    }
}
0 голосов
/ 19 ноября 2011

Вы можете попробовать что-то вроде этого (не проверено):

var sortedList = list.OrderBy(x => x.Value);
var nextValue = list.Max(x => x.Value) + 1;

foreach (var item in sortedList.Where(x => x.Value == 0))
{
    item.Value = nextValue;
    nextValue++;
}
0 голосов
/ 19 ноября 2011

Можно сначала упорядочить записи, для которых порядок не равен 0, а затем добавить или объединить записи порядка 0 в эту коллекцию.

...