单个排序的c#列表有不同的类型?

时间:2010-08-06 18:32:30

标签: c# .net list

是的,我是c#的新手! :)我正在使用.Net4 VS2010。

我有三个类,每个类用于构建该类型的对象列表。这三个都继承了基类。

我想将结果三个列表合并为一个,并在其中一个基类元素上对它们进行排序。

这可以用不同类型的列表完成吗?

简化示例:

创建每个列表

public List<TestOne> TestOne list;
public List<TestTwo> TestTwoList;
public List<object> 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; } 
} 

6 个答案:

答案 0 :(得分:5)

你应该可以这样做:

List<BaseClassTest> sorted = TestOneList.Cast<BaseClassTest>()
                    .Union(TestTwoList.Cast<BaseClassTest>())
                    .OrderBy(item => item.SeqNumber)
                    .ToList();

这将同时进行排序+联合。

答案 1 :(得分:2)

“BothLists”应该是List<BaseClassTest>.这应该让您使用。OrderBy(x => x.SequenceNumber).

对基类属性进行排序。

编辑添加:

通过评论后,这应该可以合并列表:

BothLists = TestOneList.OfType<BaseClassList>().Concat().(TestTwoList.OfType<BaseClassList>()).ToList();

通常,.OfType&lt;&gt;()优于.Cast&lt;&gt;(),因为它只是根据类型进行过滤,而不是强制转换。

答案 2 :(得分:1)

鉴于你的例子,这很容易:

public List<BaseClassTest> BothLists;

然后你可以排序:

BothLists.Sort((a, b) => a.SeqNumber.CompareTo(b.SeqNumber));  

答案 3 :(得分:1)

如果类继承自base,则它将被视为大多数操作的基类。因此:

List<BaseClassTest> AllTests;

应该得到你所需要的东西。

答案 4 :(得分:0)

使TestOne和TestTwo实现IComparable接口。 See here。然后,您可以将列表组合到ArrayList中并使用Sort方法。

答案 5 :(得分:0)

List<BaseClassTest> list3 = new List<BaseClassTest>();
list3.AddRange(list1);
list3.AddRange(list2);
var sorted = list3.OrderBy(e => e.SequenceNum).ToList(); //if you really need a list back

这就是假设你有Linq可用。当然,如果你做一个Union声明也可能有效。