1

关于如何在排序时进行投射?,我尝试了以下答案之一。

vehicleList.OrderBy(c=>
{
    Car car = c as Car;
    if (car != null)
        return car.ModelName
    else
        return "";
}

但它给出了编译器错误:

无法从用法中推断方法“System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable, System.Func)”的类型参数。尝试明确指定类型参数。

这有什么问题?如何纠正?

我试图实现的目标如下:

  • 如果对象是 Car 类型,则按 ModelName 排序
  • 否则,如果对象 ID 为 Train 类型,则为 TrainName。
4

4 回答 4

6

这解决了错误:

var sortedVehicles = vehicleList.OrderBy<Vehicle, string>(c=>
    {
        ...
    });
于 2013-02-19T07:13:05.860 回答
3

您可以像这样实施比较器:

var sorted = uiItems.OrderBy(x => x.Contact, new YourComparer ());

public class YourComparer : IComparer<Contact>
{
    public int Compare(Contact? x, Contact? y)
    {
        if (x == y)
            return 0;
        if (x == null)
            return 1;
        if (y == null)
            return -1;
        if (x.Presence == null)
            return 1;
        if (y.Presence == null)
            return -1;

        return return x.Presence < y.Presence ? -1 : 1;
    }
}
于 2013-02-19T07:11:51.287 回答
0

您是否尝试过您引用的问题中的建议来使用 Linq Cast

var sorted = uiItems.Cast<Contact>()
                    .OrderBy(c => contact.Presence; );
于 2013-02-19T07:07:45.973 回答
0

看下面的例子:

class Item
{
    public int X;
    public string Y;
}

var items = new Item[100];
var ordered = items.OrderBy<Item, string>(i => i.Y);

OrderBy需要两种类型。前者是可枚举的,后者用于 lambda 表达式。另外在某些情况下,必须转换正在使用的集合元素。如果您确定所有类型都属于特定类型或省略其他类型,则可以使用Cast方法之前。OrderByOfType

于 2013-02-19T07:17:08.847 回答