LINQ中的隐式转换错误

时间:2013-04-19 07:07:26

标签: c# .net linq

我有所有ID的列表。

//代码

List<IAddress> AllIDs = new List<IAddress>();
AllIDs= AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_"))
              .Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_")))
              .ToList();

我正在使用上面的LINQ查询,但收到编译错误:

//错误

  

无法隐式转换System.Collections.Generic.List类型   到System.Collections.Generic.List

我想基于字符“_”对成员字段AddressId进行子字符串操作。

我哪里错了?

3 个答案:

答案 0 :(得分:3)

使用where找到所需的地址,然后从id中选择一些字符串。

s.AddressId.Substring(s.AddressId.IndexOf("_")) is string

Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_"))).ToList();返回子字符串列表

只需将其删除即可使用

AllIDs= AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_")).ToList()

作为

Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_")) 

过滤AllID列表,但将其保留为IAddress s

如果你重写是这样的,你应该能够看到问题是什么

你说

var items  = from addr in AllIds 
             where addr.AddressId.Length >= addr.AddressId.IndexOf("_") // filter applied
             select addr.AddressId.Substring(s.AddressId.IndexOf("_")); // select a string from the address

AllIDs = items.ToList(); // hence the error List<string> can't be assigned to List<IAddress>

但你想要

var items  = from addr in AllIds 
             where addr.AddressId.Length >= addr.AddressId.IndexOf("_") // filter applied
             select addr;                        // select the address

AllIDs = items.ToList(); // items contains IAddress's so this returns a List<IAddress>

答案 1 :(得分:1)

如果您想使用Linq查询更新AddressId,可以这样做:

AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_"))
      .ToList()
      .ForEach(s => s.AddressId = s.AddressId.Substring(s.AddressId.IndexOf("_")));

请注意.ForEach()不是Linq扩展名,而是List&lt;类的方法。 T&gt;。

由于IndexOf可能很耗时,请考虑缓存值:

AllIDs.Select(s => new { Address = s, IndexOf_ = s.AddressId.IndexOf("_") })
      .Where(s => s.Address.AddressId.Length >= s.IndexOf_ )
      .ToList()
      .ForEach(s => s.Address.AddressId = s.Address.AddressId.Substring(s.IndexOf_ ));

答案 2 :(得分:0)

您的选择操作.Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_")))不会修改您的对象,它会将每个对象投影到子字符串。因此.ToList()会返回List<string>