2013-01-08 31 views
5

這個當前的項目更多地是一個大型項目的概念驗證。我有兩個「表格」(表示如下列表),CatListDogList,它們具有相同的列結構。我希望能夠ConcatUnion這兩個並使用LINQ對結果集執行查詢。我被告知通過執行interfaces我將能夠實現這些結果。LINQ中的Concat/Union表格

這是我到目前爲止有:

 static void Main(string[] args) 
    { 
     System.Console.Write("Hello World\n"); 
     Dog Dog1 = new Dog { name = "A", age = 1 }; 
     Dog Dog2 = new Dog { name = "B", age = 2 }; 
     Cat Cat1 = new Cat { name = "C", age = 3 }; 
     Cat Cat2 = new Cat { name = "D", age = 4 }; 

     List<Dog> DogList = new List<Dog>(); 
     List<Cat> CatList = new List<Cat>(); 
     DogList.Add(Dog1); 
     DogList.Add(Dog2); 
     CatList.Add(Cat1); 
     CatList.Add(Cat2); 

     var result = DogList 
       .Concat(CatList); 

    } 
} 

public interface iAnimal 
{ 
    string name { get; set; } 
    int age { get; set; } 
} 
public class Dog :iAnimal 
{ 
    public string name { get; set; } 
    public int age { get; set; } 
} 
public class Cat:iAnimal 
{ 
    public string name { get; set; } 
    public int age { get; set; } 
} 

我可以訪問任何的任何使用類似System.Console.Write(Dog1.name);我創建的對象的數據成員的,所以我覺得我實現的接口是正確的。爲了有效地Concat /聯合我的列表,需要在LINQ語句中更改哪些內容。

我對C#和麪向對象的編程一般都比較陌生,所以請迎合您的答案以適應我的知識水平。

感謝

編輯 我很抱歉,我忘了包括錯誤消息我在當前的代碼獲得。

Error 1 'System.Collections.Generic.List<InterfaceTest.Dog>' does not contain a definition for 'Concat' and the best extension method overload 'System.Linq.ParallelEnumerable.Concat<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments 

Error 2 Instance argument: cannot convert from 'System.Collections.Generic.List<InterfaceTest.Dog>' to 'System.Linq.ParallelQuery<InterfaceTest.Cat>' 
+0

對不起,忘記了包含錯誤。問題是固定的。 – Jeff

回答

13

的問題是,編譯器不能通過連接一個List<Dog>和一個List<Cat>它應該產生一個iAnimal的集合。默認情況下,它會看到一個List<Dog>,並且期望以下集合也是Dog的集合。

你可以明確地告訴通過提供通用的參數Concat對待每件事情都作爲iAnimal這一點,即

var result = DogList.Concat<iAnimal>(CatList); 

你再拿到IEnumerable<iAnimal>類型的result

編輯:如果你被困在.NET 3.5中,你需要像

3.5不能自動轉換collection of something that inherits iAnimalcollection of iAnimal

+3

請注意,這需要C#4來支持協變。 –

+1

哦,真的嗎?謝謝喬恩。 (我明顯設法接受協變,並且在我使用它時沒有注意到。) – Rawling

+0

這解決了我的問題(+1),但有趣的是,[MSDN文檔](http://msdn.microsoft.com/zh-cn/ -us /庫/ bb397914。aspx)似乎建議你可以在不使用這種技術的情況下'Concat'兩個對象,甚至當它們不共享繼承時 –

3

通用列表是由不同類型的(狗和貓),你必須在連接前他們「投」的目標接口:

var list1 = DogList.Cast<IAnimal>(); 
var list2 = CatList.Cast<IAnimal>(); 

var bothLists = list1.Concat(list2); //optional .ToList() 
+0

我沒有嘗試過,但它看起來應該工作考慮它只是使用'List'擴展方法。我在尋找一個LINQ解決方案,因爲這只是一個更大的概念驗證項目。 – Jeff

+1

@Jeff'Cast'是LINQ方法,而不是'List'方法。 – Servy

+0

啊,有趣。不理我的評論。 – Jeff