LINQ

2013-01-08 17 views
5

में कंसैट/यूनियन टेबल्स यह वर्तमान प्रोजेक्ट एक बड़ी परियोजना के लिए अवधारणा का सबूत है। मेरे पास दो "टेबल" हैं (नीचे दी गई सूचियों के रूप में प्रतिनिधित्व), CatList और DogList, जिनमें समान स्तंभ संरचना है। मैं Concat या Union दोनों में सक्षम होना चाहता हूं और परिणामस्वरूप सेट पर LINQ का उपयोग कर क्वेरी करना चाहता हूं। मुझे बताया गया कि interfaces को लागू करके मैं इन परिणामों को प्राप्त करने में सक्षम हूं।LINQ

यहाँ मैं अब तक है:

 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 iAnimalcollection of something that inherits iAnimal परिवर्तित नहीं कर सकते देंगे।

+3

ध्यान दें कि इसे covariance समर्थन के लिए C# 4 की आवश्यकता है। –

+1

ओह, वास्तव में? धन्यवाद जॉन (मैंने जाहिर तौर पर कॉन्वर्सिस स्वीकार करने में कामयाब रहा है और जब मैं इसका उपयोग कर रहा हूं तो ध्यान नहीं दिया गया है।) – Rawling

+0

इसने मेरी समस्या (+1) हल की, लेकिन दिलचस्प बात यह है कि [एमएसडीएन डॉक्स] (http://msdn.microsoft.com/en -US/पुस्तकालय/bb397914।एएसपीएक्स) का सुझाव है कि आप इस तकनीक के बिना दो ऑब्जेक्ट्स 'कंसैट' कर सकते हैं और यहां तक ​​कि जब वे एक सामान्य विरासत साझा नहीं करते हैं –

3

सामान्य सूचियों विभिन्न प्रकार (कुत्ता और बिल्ली), तो आप संयोजन से पहले लक्ष्य इंटरफ़ेस करने के लिए उन्हें "डाली" करने के लिए है से कर रहे हैं:

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

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

मैंने यह कोशिश नहीं की है, लेकिन ऐसा लगता है कि इसे 'सूची' एक्सटेंशन विधियों का उपयोग करने पर विचार करना चाहिए। मैं एक 'LINQ' समाधान की तलाश में था क्योंकि यह केवल एक बड़े के लिए अवधारणा परियोजना का सबूत है। – Jeff

+1

@ जेफ 'कास्ट' एक LINQ विधि है, न कि 'सूची' विधि। – Servy

+0

आह, दिलचस्प। मेरी टिप्पणी को रद्द करें। – Jeff

संबंधित मुद्दे