2013-03-07 61 views
3

我收到下方一行中的错误。无法投射清单

temp.day1_veh_p = string.Join(Environment.NewLine, day1.Where(x => x.plannedTriips == 1).Select(x => new {value=x.vehicleNumber+":"+x.shiftCompletedOn }).Cast<string>().ToArray()); 

钍错误信息是

Unable to cast object of type '<>f__AnonymousType0`1[System.String]' to type 'System.String'. 

名单DAY1的类型是

public class tripDetails 
{ 
    public string accountID { get; set; } 
    public string supplierName { get; set; } 
    public string supplierCode { get; set; } 
    public DateTime shiftFrom { get; set; } 
    public DateTime shiftTo { get; set; } 
    public int plannedTriips { get; set; } 
    public int actualTrips { get; set; } 
    public DateTime forDate { get; set; } 
    public string vehicleNumber { get; set; } 
    public string shiftCompletedOn { get; set; } 
    public class Comparer : IEqualityComparer<tripDetails> 
    { 
     public bool Equals(tripDetails x, tripDetails y) 
     { 
      return x.supplierCode == y.supplierCode; 
     } 

     public int GetHashCode(tripDetails obj) 
     { 
      return (obj.supplierCode).GetHashCode(); 
     } 
    } 
} 

我究竟在做什么错?

回答

6

的问题是new { value = ... }

替换:

Select(x => new {value=x.vehicleNumber+":"+x.shiftCompletedOn }).Cast<string>() 

Select(x => x.vehicleNumber+":"+x.shiftCompletedOn) 

和你排序。你根本不需要Cast<string>()

您的原始代码为每条记录创建一个匿名类型的新实例,该实例的成员名为value,并带有所需的字符串;第二个版本只是创建字符串。

在某种程度上,这是在尝试此没有什么不同:

class Foo 
{ 
    public string Bar {get;set;} 
} 
... 
var foo = new Foo { Bar = "abc" }; 
string s = (string)foo; // doesn't compile 
+0

谢谢..!并很好地解释了.. !!! – writeToBhuwan 2013-03-07 13:11:08

5

是的,一个匿名类型不是一个字符串,因此更换此

.Select(x => new { value = x.vehicleNumber + ":" + x.shiftCompletedOn }) 

.Select(x => x.vehicleNumber + ":" + x.shiftCompletedOn) 

然后你就可以使用查询(您不必创建一个新的数组)为string.Join

这也有利于使用多条线路,它使你的代码更可读:

var vehicles = day1.Where(x => x.plannedTriips == 1) 
       .Select(x => x.vehicleNumber + ":" + x.shiftCompletedOn); 
string str = string.Join(Environment.NewLine, vehicles); 
3

(x => String.Format("{0}\:{1}", x.vehicleNumber, x.shiftCompletedOn)) 

替换此

(x => new {value=x.vehicleNumber+":"+x.shiftCompletedOn }).Cast<string>() 

当你正在做new { ... }您正在创建匿名类型的项目,然后(Cast<string() )试图明确地转换成string,并且此类转换未定义 - 您最终会得到适当的例外。