我有所有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
进行子字符串操作。
我哪里错了?
答案 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>
。