LINQ中的隐式转换错误

本文关键字:转换 错误 LINQ | 更新日期: 2023-09-27 18:10:09

我有所有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进行子字符串操作。

我错在哪里?

LINQ中的隐式转换错误

你可以用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>

如果您想用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 .

由于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_ ));

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