2

我们有几种不同的数据类型,它们都共享一个特定的基类。我们还有一个List<BaseClass>包含这些子类对象的随机集合,没有特定的顺序。

使用 Linq/Lambda 表达式,我们尝试提取每个单独的子类类型,按该特定子类的属性排序,然后将其存储在强类型值中List<SubclassType>

这是我目前正在做的事情,但不是 LINQ 专家,我觉得有一种更简单的方法可以实现这一目标。(我感觉我的 Where 和 Select 在某种程度上是多余的,并且会导致对集合的过度传递,但我可能是错的。)

class baseItem{}

class subItemX : baseItem
{
    public int XSortValue{ get; set; }
}

class subItemY : baseItem
{
    public int YSortValue{ get; set; }
}

List<MyBaseClass> allItems = GetAllItems(); // Random collection of subclass objects.

// Is there an easier/less verbose way to achieve these two?
List<SubItemX> xItemsOnly = allItems
    .Where(baseItem => baseItem is SubItemX)
    .Select(baseItem => baseItem as SubItemX)
    .OrderBy(subItemX => subItemX.XSortValue)
    .ToList();

List<SubItemY> yItemsOnly = allItems
    .Where(baseItem => baseItem is SubItemY)
    .Select(baseItem => baseItem as SubItemY)
    .OrderBy(subItemY => subItemY.YSortValue)
    .ToList();

然而,我有一种感觉,我让这些变得比他们需要的复杂得多。这是最有效的方法吗?

4

1 回答 1

9

您想利用OfType<T>过滤混合序列并将结果提取为所需类型。

var xItemsOnly = allItems.OfType<SubItemX>().OrderBy(s => s.XSortValue).ToList();

您可能希望探索的类似方法是Cast<T>,不是过滤和转换,而是简单地转换(如果转换不成功则抛出)。如果您知道一个较小派生类型的序列中的所有项目实际上是更多派生类型,请使用此选项。否则,如果您的意图是过滤可能混合的序列,请使用OfType<T>先前显示的方法(根据您的问题,这肯定是您会做的)。

于 2013-04-17T03:48:03.047 回答