c#根据编号对列表进行排序

时间:2011-11-19 01:18:04

标签: sorting c#-3.0

我有一个用户可以使用jquery排序的字段列表。我将这些更新的字段保存在数据库中。可以在报告中添加和删除相同的字段,因此在某些情况下我会field1, field55, field 3。这些字段可以按随机顺序出现(基于它在报告中的显示位置)。

我正在尝试对列表进行排序,在大多数情况下,该字段将具有值,但也可以为0.

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

我有一个列表,我使用方法list.orderby(x=> x.Value);这将按正确的顺序对字段进行排序,但是我想得到其余的字段,其顺序为0,并附加到列表的末尾<列表中的强>最大数字。

e.g。列表中最高的数字是78,我有4个字段,其中prop = 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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以先订购没有order = 0的记录,然后将order = 0记录追加或联合到该集合。

答案 2 :(得分:0)

您可以像这样创建自己的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;
    }
}

答案 3 :(得分:0)

您可以尝试这样的事情(未经测试):

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++;
}