我有3个.net列表项,我需要将它们全部合并为一个,以便对它们进行排序并将它们绑定到数据网格。但是,我需要一种方法来指示每个项目来自哪个原始列表,以便我可以在datagrid中识别它(更改颜色或字体等)。
有人能建议最好的方法吗?
答案 0 :(得分: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
根据需要展开属性。
答案 1 :(得分:1)
假设您的列表包含可以修改的类项,我建议您向这些类添加一个属性,以跟踪它的3类型。如果你可能需要回访,可以是enum
,也可以是对包含它的实际list
的引用。
如果你不能这样做但是假设它们确实包含一个名称属性或者类似物并且它是一个只读网格,那么一种非常丑陋的方式就是在名称中添加一个特定的前缀/后缀来说明它来自哪里从而然后删除该前缀/后缀,然后在屏幕上显示它。
答案 2 :(得分: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();
答案 3 :(得分: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的概念。