2013-01-08 32 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