2011-08-16 16 views
33

2 वर्ग है जो कुछ समान गुण होते हैं है सूची कन्वर्ट करने के लिए। मैं 1 वर्ग से एक सूची गुण में शेयर, और उसके बाद, मैं कुछ की जरूरत गुण लेते हैं और उन्हें 2 वर्ग प्रकार की एक सूची में डाल दिया करना चाहते हैं। मैंने सी # के माध्यम से कास्ट अनुक्रम बनाया है और यह ठीक चलता है, लेकिन मुझे LINQ के साथ करना होगा। मैंने कुछ करने की कोशिश की लेकिन अच्छे नतीजों के बिना। सुझावों के साथ कृपया मेरी मदद करें।LINQ का उपयोग करने के लिए सूची <T>

1 कक्षा:

public class ServiceInfo { 
    private long _id; 
    public long ID { 
     get { return this._id; } 
     set { _id = value; } 
    } 

    private string _name; 
    public string Name { 
     get { return this._name; } 
     set { _name = value; } 
    } 

    private long _qty; 
    public long Quantity { 
     get { return this._qty; } 
     set { _qty = value; } 
    } 

    private double _amount; 
    public double Amount { 
     get { return this._amount; } 
     set { _amount = value; } 
    } 

    private string _currency; 
    public string Currency { 
     get { return this._currency; } 
     set { _currency = value; } 
    } 

    private DateTime? _date; 
    public DateTime? Date { 
     get { return this._date; } 
     set { _date = value; } 
    } 
} 

2 कक्षा:

class InvoiceWithEntryInfo { 
    private string currencyField; 

    private long IdField; 
    public long IdIWEI { 
     get { return this.IdField; } 
     set { IdIWEI = value; } 
    } 

    private string nameField; 
    public string NameIWEI { 
     get { return this.nameField; } 
     set { NameIWEI = value; } 
    } 

    private long qtyField; 
    public long QuantityIWEI { 
     get { return this.qtyField; } 
     set { QuantityIWEI = value; } 
    } 

    private double amountField; 
    public double AmountIWEI { 
     get { return this.amountField; } 
     set { AmountIWEI = value; } 
    } 

    private DateTime dateField; 
    public DateTime? DateIWEI { 
     get { return this.dateField; } 
     set { DateIWEI = value; } 
    } 

    public string OwnerIWEI { 
     get; set; 
    } 
} 

सी # नमूना जो ठीक चलाता है: ...

var sil = new List<ServiceInfo>(); 
var iweil = new List<InvoiceWithEntryInfo>(); 

...

if (sil != null) 
    { 
     foreach (ServiceInfo item in sil) 
     { 
      iweil.Add(new InvoiceWithEntryInfo 
       { 
        IdIWEI = item.ID, 
        AmountIWEI = item.Amount, 
        DateIWEI = item.Date 
       }); 
     } 

LINQ नमूना जो does not को रन ठीक है:

  iweilCOPY = sil.ConvertAll<InvoiceWithEntryInfo>(a => (InvoiceWithEntryInfo)a); 

      iweilCOPY = sil.FindAll(a => (sil is InvoiceWithEntryInfo)).ConvertAll<InvoiceWithEntryInfo>(a => (InvoiceWithEntryInfo)a); 
+3

:) मैं 2011 में शुरुआत में था। अब जब मैं यह प्रश्न देखता हूं तो मैं चिल्ला रहा हूं। (चक्कर) महान समय !!! – meorfi

उत्तर

59
var iweilCopy = sil.Select(item => new InvoiceWithEntryInfo() 
{ 
    IdWEI = item.Id, 
    NameWEI = item.Name, 
    .... 
}).ToList(); 
10
var iweil = sil.Select(item=> new InvoiceWithEntryInfo { 
       IdIWEI = item.ID, 
       AmountIWEI = item.Amount, 
       DateIWEI = item.Date}).ToList(); 
5

बस का उपयोग करें:

if(sil != null) 
{ 
    var iweil = sil.Select(item=>new InvoiceWithEntryInfo() 
      { 
       IdIWEI = item.ID, 
       AmountIWEI = item.Amount, 
       DateIWEI = item.Date 
      }).ToList(); 
} 
8

आप एक U उदाहरण के लिए एक T उदाहरण कन्वर्ट करने के लिए एक समारोह की जरूरत है:

ResultType ConvertMethod(StartType input) 

और आपको इसे लिखना होगा। फिर

outputList = inputList.Select(ConvertMethod).ToList(); 

इसे पूरे इनपुट संग्रह पर लागू करेगा। रूपांतरण फ़ंक्शन एक लैम्ब्डा लिखित इनलाइन हो सकता है लेकिन (यदि फ़ंक्शन का सही हस्ताक्षर है, जैसे ConvertMethod) तो संकलक Select पर जाने के लिए इसे सही रूप से परिवर्तित कर देगा)।

+1

क्या आप कुछ वास्तविक उदाहरण प्रदान कर सकते हैं, कृपया? आपका जवाब सबसे अच्छा है! –

+0

सूची संख्या = नई सूची () {1, 2, 3}; समारोह numToStringWithLPad = मैं => "संख्या:" + मैं; var numAsString = संख्याएं।का चयन करें (numToStringWithLPad); numAsString.ToList()। ForEach (i => Console.WriteLine (i)); आउटपुट: संख्या: 1 संख्या: 2 संख्या: 3 –

2
आपका नियमित सी # कोड और LINQ

बराबर नहीं हैं। नियमित सी # में आप दूसरे वर्ग के एक नए उदाहरण को तत्काल बनाते हैं और गुणों को प्रारंभ करते हैं, जबकि आप एक से दूसरे में (अच्छी तरह से परिवर्तित) कास्ट करने का प्रयास करते हैं; हालांकि, चूंकि वे एक ही कक्षा पदानुक्रम में नहीं हैं, इसलिए आप कास्ट नहीं कर सकते हैं, और जैसा कि आपने एक रूपांतरण ऑपरेटर परिभाषित नहीं किया है, आप कन्वर्ट नहीं कर सकते हैं (कास्ट सिंटैक्स का उपयोग करके)।

आप या तो एक रूपांतरण ऑपरेटर

public static explicit operator InvoiceWithEntryInfo(ServiceInfo item){ 
    return new InvoiceWithEntryInfo { 
      IdIWEI = item.ID, 
      AmountIWEI = item.Amount, 
      DateIWEI = item.Date}; 
} 

या नियमित रूप से विधि हस्ताक्षर का उपयोग कर एक रचना विधि को परिभाषित करने के लिए है। मैं उत्तरार्द्ध का सुझाव दूंगा क्योंकि पूर्व में कुछ ऐसा होने का नाटक था। यह एक कलाकार नहीं है और मैं व्यक्तिगत रूप से यह देखने में सक्षम होना चाहता हूं कि कोड कुछ इनपुट के आधार पर एक नया उदाहरण बनाता है।

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