按匿名方法排序

时间:2013-02-19 07:01:25

标签: c# .net linq compiler-errors sql-order-by

关于How to cast while Sorting?,我尝试了下面的答案之一。

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 个答案:

答案 0 :(得分:6)

这解决了错误:

var sortedVehicles = vehicleList.OrderBy<Vehicle, string>(c=>
    {
        ...
    });

答案 1 :(得分:2)

你可以实现这样的比较器:

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;
    }
}

答案 2 :(得分:0)

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

var sorted = uiItems.Cast<Contact>()
                    .OrderBy(c => contact.Presence; );

答案 3 :(得分: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,则可以在OrderBy之前使用OfType方法,以便省略其他类型。