2013-01-08 41 views
5

Dự án hiện tại này là một bằng chứng về khái niệm cho một dự án lớn hơn. Tôi có hai "bảng" (được trình bày dưới dạng danh sách bên dưới), CatListDogList, có cấu trúc cột giống hệt nhau. Tôi muốn có thể Concat hoặc Union cả hai và thực hiện truy vấn trên tập hợp kết quả bằng cách sử dụng LINQ. Tôi đã nói rằng bằng cách thực hiện interfaces tôi sẽ có thể đạt được những kết quả này.Bảng Concat/Union trong LINQ

Dưới đây là những gì tôi có cho đến nay:

 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; } 
} 

tôi có thể truy cập vào bất kỳ của các thành viên dữ liệu của bất kỳ của các đối tượng được tạo ra của tôi sử dụng một cái gì đó giống như System.Console.Write(Dog1.name);, vì vậy tôi nghĩ tôi thực hiện các giao diện là đúng. Những gì cần phải được thay đổi trong tuyên bố LINQ của tôi để có hiệu quả Concat/Liên minh danh sách của tôi.

Tôi khá mới với C# và lập trình hướng đối tượng nói chung, vì vậy hãy đáp ứng câu trả lời của bạn cho phù hợp với trình độ kiến ​​thức của tôi.

Cảm ơn

EDIT Tôi xin lỗi, như tôi đã quên để bao gồm các thông báo lỗi tôi nhận được trong mã hiện tại của tôi.

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

Xin lỗi, quên bao gồm lỗi. Câu hỏi là cố định. – Jeff

Trả lời

13

Vấn đề là trình biên dịch có thể không tìm ra rằng bằng cách ghép một số List<Dog>List<Cat>, nó sẽ tạo một bộ sưu tập gồm iAnimal s. Theo mặc định, nó sẽ thấy một số List<Dog> và dự kiến ​​bộ sưu tập sau sẽ là bộ sưu tập gồm Dog.

Bạn rõ ràng có thể nói để điều trị tất cả mọi thứ như một iAnimal này bằng cách cung cấp các tham số tổng quát để Concat, ví dụ:

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

Sau đó bạn nhận được một result loại IEnumerable<iAnimal>.

Edit: Nếu bạn đang bị mắc kẹt trên .NET 3.5, bạn sẽ cần một cái gì đó giống như

như 3.5 không thể tự động chuyển đổi collection of something that inherits iAnimal-collection of iAnimal.

+3

Lưu ý rằng điều này yêu cầu C# 4 hỗ trợ hiệp phương sai. –

+1

Ồ, thật sao? Cảm ơn Jon. (Tôi dường như đã chấp nhận hiệp phương sai và không thông báo khi tôi đang sử dụng nó.) – Rawling

+0

Điều này giải quyết được vấn đề của tôi (+1), nhưng thú vị là [MSDN docs] (http://msdn.microsoft.com/en -us/library/bb397914.aspx) dường như gợi ý bạn có thể 'Concat' hai đối tượng không có kỹ thuật này và thậm chí khi chúng không chia sẻ một thừa kế chung –

3

Các danh sách chung là từ các loại khác nhau (Chó và Mèo), bạn cần phải "diễn viên" chúng vào giao diện mục tiêu trước khi nối:

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

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

Tôi đã không thử điều này, nhưng có vẻ như nó nên làm việc xem xét nó chỉ sử dụng 'List' mở rộng phương pháp. Tôi đã tìm kiếm một giải pháp 'LINQ' vì đây chỉ đơn giản là một bằng chứng về dự án khái niệm cho một dự án lớn hơn. – Jeff

+1

@Jeff 'Cast' là phương thức LINQ, không phải là phương thức' Danh sách'. – Servy

+0

Ah, thú vị. Bỏ qua bình luận của tôi. – Jeff