2011-11-19 53 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++; 
}