2

我有一个清单AllIDs

List<IAddress> AllIDs = new List<IAddress>();

我想根据字符“_”substring对成员字段进行操作。AddressId

我正在使用以下 LINQ 查询,但出现编译错误:

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

错误:

无法将类型“System.Collections.Generic.List<string>”隐式转换为“System.Collections.Generic.List<MyCompany.Common.Users.IAddress>”

4

3 回答 3

3

AllIDs是一个列表,IAddress但您正在选择一个string. 编译器抱怨它无法将 a 转换List<string>为 a List<IAddress>。你的意思是以下吗?

var substrings = AllIDs.Where(...).Select(...).ToList();
于 2012-10-12T05:46:52.017 回答
0

如果你想把它们放回Address对象中(假设你有一个Address除了你的IAddress接口之外的类),你可以做这样的事情(假设构造函数Address就位):

AllIDs = AllIDs.Where(...).Select(new Address(s.AddressID.Substring(s.AddressID.IndexOf("_")))).ToList();

您还应该考虑使用 LINQ 的查询语法而不是方法语法,它可以清理和提高很多这样的查询的可读性。您的原始(未修改)查询大致相当于:

var substrings = from a in AllIDs
                 let id = a.AddressId
                 let idx = id.IndexOf("_")
                 where id.Length >= idx
                 select id.Substring(idx);

虽然这实际上只是一个风格的东西,而且它编译成与原版相同的东西。一个细微的区别是您只需String.IndexOf()每次调用​​一次,而不是每次调用两次。 let是你的朋友。

于 2012-10-12T06:56:26.180 回答
0

也许这个?

var boundable  = 
    from s id in AllIDs
    where s.AddressId.Length >= s.AddressId.IndexOf("_")
    select new { AddressId = s.AddressId.Substring(s.AddressId.IndexOf("_")) };
boundable = boundable.ToList();
于 2012-10-12T12:51:54.663 回答