2

我有所有 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根据字符“_”对成员字段进行子字符串操作。

我哪里错了?

4

3 回答 3

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 列表,但将它们保留为IAddresss

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

你说

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>
于 2013-04-19T07:09:55.697 回答
1

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

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

注意.ForEach()不是 Linq 扩展,而是 List<T> 类的方法。

由于 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_ ));
于 2013-04-19T07:17:16.740 回答
0

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

于 2013-04-19T07:11:06.673 回答