单个排序的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可用。 当然,如果你做联盟声明也可能有效。