2010-06-04 54 views
1

我有3個.net列出項目,我需要將它們合併爲一個,將它們排序並將它們綁定到數據網格。但是,我需要一種方式來指示每個項目來自哪個原始列表,以便我可以在數據網格中識別這些(更改顏色或字體等)。合併列表<>和維護標識

任何人都可以建議最好的方法來做到這一點?

+0

列表包含哪些類型的對象? – 2010-06-04 13:11:05

回答

5
List<Foo> list1 = new List<Foo>(); 
List<Foo> list2 = new List<Foo>(); 
List<Foo> list3 = new List<Foo>(); 

var query = list1.Select(foo => new { foo, list = "list1" }) 
    .Concat(list2.Select(foo => new { foo, list = "list2" })) 
    .Concat(list3.Select(foo => new { foo, list = "list3" })) 
    .OrderBy(item => item.foo); // whatever you need to order by 

根據需要展開屬性。

+0

用OrderBy結束這一切,你是金:) – 2010-06-04 13:18:56

+0

哦,當然,orderby。 – 2010-06-04 13:19:43

1

假設您的列表包含您可以修改的類的項目,我建議您將屬性添加到那些跟蹤它是哪種類型的類。或者作爲enum或者如果您可能需要回頭參考其中包含的實際list

如果你不能這樣做,但假設他們確實包含一個名稱屬性或類似的,它是一個只讀網格,一個非常醜陋的方法是添加一個特定的前綴/後綴名稱,說明它的位置來自,然後在顯示在屏幕上之前刪除該前綴/後綴。

1

簡單的解決方案,假設你不想修改原來的類,或者它是一個原始的,你可以使用匿名類型:

var resultList = list1.Select(value => new {value, list = list1}) 
       .Concat(list2.Select(value => new {value, list = list2}) 
       .Concat(list3.Select(value => new {value, list = list3}))) 
       .ToList(); 
0

我會像這樣的東西去:

List<object> list1 = new List<object>(); 
List<object> list2 = new List<object>(); 
List<object> list3 = new List<object>(); 

List<KeyValuePair<int, object>> mergedList = new List<KeyValuePair<int, object>>(); 

mergedList.AddRange(list1.Select(obj => new KeyValuePair<int, object>(1, obj))); 
mergedList.AddRange(list2.Select(obj => new KeyValuePair<int, object>(2, obj))); 
mergedList.AddRange(list3.Select(obj => new KeyValuePair<int, object>(3, obj))); 

更好的解決方案,雖然,將一個屬性添加到您的對象,它是某種枚舉的,告訴你一些有關的對象本身。列表本身是某種類型的元數據 - list1是X的列表,而不僅僅是一個列表,所以它的所有元素都應該有某種X的概念。