我有一个用户可以使用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;
}
答案 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++;
}