单个排序的c#列表有不同的类型?
是的,我是c#的新手! :)我正在使用.Net4 VS2010。
我有三个类,每个类用于构建该类型的对象列表。 这三个都inheritance了基类。
我想将得到的三个列表合并为一个,并在其中一个基类元素上对它们进行排序。
这可以用不同类型的列表完成吗?
简化示例:
每个列表都已创建
public List TestOne list; public List TestTwoList; public List BothLists;
填写TestOne和TestTwo的代码……
什么/如何将TestOne和TestTwo结合到BothLists中并在SeqNumber上对它们进行排序?
public class BaseClassTest { public string Loc { get; set; } // loc // sequence number to order by will be assigned in the resulting class public int SeqNumber { get; set; } } public class TestOne : BaseClassTest { public int Number { get; set; } } public class TestTwo : BaseClassTest { public string CatName { get; set; } }
你应该能够做到:
List sorted = TestOneList.Cast () .Union(TestTwoList.Cast ()) .OrderBy(item => item.SeqNumber) .ToList();
这将同时进行排序+联合。
“BothLists”应该是List
这应该让你使用基类属性排序。 OrderBy(x => x.SequenceNumber).
编辑添加:
跟进评论后,这应该可以合并列表:
BothLists = TestOneList.OfType().Concat().(TestTwoList.OfType ()).ToList();
通常,.OfType <>()优于.Cast <>(),因为它只是根据类型进行过滤,而不是强制转换。
举个例子,这很简单:
public List BothLists;
然后你可以排序:
BothLists.Sort((a, b) => a.SeqNumber.CompareTo(b.SeqNumber));
如果类inheritance自base,则它将被视为大多数操作的基类。 从而:
List AllTests;
应该得到你需要的东西。
使TestOne和TestTwo实现IComparable接口。 看到这里 。 然后,您可以将列表组合到ArrayList中并使用Sort方法。
List list3 = new List (); list3.AddRange(list1); list3.AddRange(list2); var sorted = list3.OrderBy(e => e.SequenceNum).ToList(); //if you really need a list back
这一切都假设你有Linq可用。 当然,如果你做联盟声明也可能有效。