2013-02-19 83 views
1

关于How to cast while Sorting?,我尝试了下面的答案之一。以匿名方式订购

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

但它会产生编译错误:

The type arguments for method 'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable, System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

有什么不对呢?如何纠正?

我试图实现的是如下:

  • 排序MODELNAME如果对象是类型的车
  • 否则,如果这类列车的对象ID,然后通过TrainName。
+0

你的代码说'联系',但你说的是'汽车'和'火车'!什么是'uiItems'? – 2013-02-19 07:06:31

+0

对不起,我把实际的程序代码...我使用车辆,因为它很容易理解...现在会改正。谢谢 – user2025418 2013-02-19 07:08:02

+0

'vehicleList'的类型是什么?通常你不应该得到这个错误。 – 2013-02-19 07:41:49

回答

6

这解决了错误:

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

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

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

虽然有些项目不是“联系人”,但具有不同的行为。 – Cameron 2013-02-19 07:08:40

+0

也许TypeOf更适合在这里使用。预计该集合具有非联系人值。 var sorted = uiItems.TypeOf () .OrderBy(c => contact.Presence;); – Alex 2013-02-19 07:11:07

+0

@voo:'OfType'并不完全具有相同的行为 - 它排除了来自已排序枚举的不是“Contact”的对象。 – Cameron 2013-02-19 07:12:13

2

您可以ipmplement这样的比较器:

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