2012-10-12 72 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();