【问题标题】:Single sorted c# list with different types?具有不同类型的单排序 C# 列表?
【发布时间】:2010-08-06 18:32:30
【问题描述】:

是的,我是 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; } 
} 

【问题讨论】:

  • 仅供参考,在此示例中,BothLists 可以是 BaseClassTest 类型。

标签: c# .net list


【解决方案1】:

你应该可以做到:

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

这将一次性完成你的排序+联合。

【讨论】:

  • +1 最完整。 Union 删除重复项(与 AddRange 相比),我觉得这就是 OP 想要的,但想为 googlers 提一下。
  • 这是使用声明式风格的最佳示例。我不能说我喜欢列表的构建,然后在其他答案中排序然后构建第二个列表。
  • 不错。错字: var sorted = listOne.Cast() .Union(listTwo.Cast()) .OrderBy(item => item.SeqNumber).ToList();
  • 谢谢大家的回答这是我第一次尝试,它有效:)
  • BaseClassText 应该是 BaseClassTest
【解决方案2】:

"BothLists" 应该是 List&lt;BaseClassTest&gt;. 这应该让您使用 .OrderBy(x =&gt; x.SequenceNumber). 对基类属性进行排序

编辑添加:

从 cmets 跟进,这应该可以合并列表:

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

通常,.OfType() 比 .Cast() 更可取,因为它只是根据类型进行过滤,而不是强制转换。

【讨论】:

  • 根据列表的大小,他们可能想要就地排序。
【解决方案3】:

鉴于您的示例,这很容易:

public List<BaseClassTest> BothLists;

然后就可以排序了:

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

【讨论】:

    【解决方案4】:

    如果一个类从基类继承,则它被视为大多数操作的基类。因此:

    List<BaseClassTest> AllTests;
    

    应该会给你你需要的东西。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:
        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。当然,如果您执行联合声明也可能有效。

        【讨论】:

          猜你喜欢
          • 2013-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-10
          相关资源
          最近更新 更多