2011-11-19 72 views
1

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

我想排序列表,在大多数情况下,该领域将有一个价值,但它也可以是0

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

我有,我使用的方法list.orderby(x=> x.Value);这将在排序字段列表正确的顺序,但是我想得到剩下的字段whos order = 0,并追加到列表的最后最大列表中的数字。

例如列表中最高的数字是78,我有4个字段的道具Order = 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

我假设你正在从数据库中获取列表项目,难道不会更好吗?他们在SQL? – bakoyaro

+0

内存查询,数据库调用事后,我只想要匹配用户选择的ID的数据库ID,否则我将有一个*大量*查询回来......我只是在进行排序,而我正在访问这个名单。 – Haroon

回答

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 
+0

+1很好的答案,它是完整的代码和输出 – bakoyaro

0

你可以命令没有为了= 0第一个记录,然后附加或联合的顺序= 0记录到那个集合。

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