2012-10-12 49 views
2

我有一个列表AllIDs什么是错在这LINQ查询,获得编译错误

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

我想要做的基于角色的成员场AddressIdsubstring操作“_”。

我使用下面的LINQ查询,但得到的编译错误:

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

错误:

Cannot implicitly convert type 'System.Collections.Generic.List<string>' to 'System.Collections.Generic.List<MyCompany.Common.Users.IAddress>'

回答

3

AllIDsIAddress列表,但选择的是string。编译器抱怨它无法将List<string>转换为List<IAddress>。相反,你的意思是?

var substrings = AllIDs.Where(...).Select(...).ToList(); 
+0

但问题是我想提供结果列表作为下拉的数据源。结果列表没有属性AddressID。 – user1740172

0

如果你想要把它们放回Address对象(假设你有除了你IAddress接口的Address类),你可以这样做(假设构造函数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是你的朋友。

+0

嗨马修感谢你的回应。 但问题是我想提供您的示例子字符串中的结果列表作为下拉的数据源。并且结果列表将不具有正在使用的属性AddressID,如下所示。 ddl.DataSource = AllIDs; ddl.DataTextField =“AddressID”; ddl.DataValueField =“AddressID”; ddl.DataBind(); 我可以使用ForEach,但希望使用LINQ来完成。任何指针? – user1740172

+0

看看wasp的解决方案,它应该与这个数据绑定一起工作。 –

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();