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
进行子字符串操作。
我错在哪里?
你可以用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>
。