लंबोदर अभिव्यक्ति का उपयोग करके वस्तुओं की एक सूची से दूसरे प्रकार में परिवर्तित करें


224

मेरे पास एक प्रकार की वस्तुओं की एक सूची पढ़ने और एक अलग प्रकार की वस्तुओं की सूची बनाने के लिए एक फ़ॉरच लूप है। मुझे बताया गया था कि एक लंबोदर अभिव्यक्ति एक ही परिणाम प्राप्त कर सकती है।

var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>(); 

foreach(OrigType a in origList) {
    targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}

किसी भी मदद की सराहना की जाएगी - मैं भेड़ के बच्चे के लिए नया हूँ और धन्यवाद धन्यवाद, एस


@mmcrae यह सवाल इस एक से नया है
एंडी

जवाबों:


312

निम्नलिखित का प्रयास करें

var targetList = origList
  .Select(x => new TargetType() { SomeValue = x.SomeValue })
  .ToList();

यह समाधान प्राप्त करने के लिए लैम्ब्डा और लिनक्यू के संयोजन का उपयोग कर रहा है। सेलेक्ट फंक्शन एक प्रोजेक्शन स्टाइल मेथड है, जो ऑरिजनल (या इस मामले में लैम्ब्डा) में ऑरिजनल कलेक्शन में हर वैल्यू में पास होगा। परिणाम एक नए में वापस आ जाएगा IEnumerable<TargetType>। .ToList कॉल एक विस्तार विधि है जो इसे IEnumerable<TargetType>एक में बदल देगी List<TargetType>


क्या इसके लिए कोई ठोस कार्यान्वयन किए बिना ऐसा करने का कोई तरीका है TargetType? मैंने कुछ इस तरह से समाप्त किया है: List<ISearchEntity> results = myIQueryable.Select(x => (ISearchEntity) new TargetType { MyField = "Field value is " + x.TargetField }).ToList();जहां लक्ष्य प्रकार की एक वस्तु प्राप्त करना थाList<ISearchEntity>
हारून न्यूटन

220

आप तो जानते हैं कि आप से परिवर्तित करना चाहते List<T1>करने के लिए List<T2>तो List<T>.ConvertAllकी तुलना में थोड़ा अधिक योग्य होंगे Select/ ToListक्योंकि यह सटीक आकार के साथ शुरू करने के लिए जानता है:

target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });

अधिक सामान्य मामला है जब आप केवल एक के रूप में स्रोत के बारे में पता में IEnumerable<T>, का उपयोग करते हुए Select/ ToListजाने का रास्ता है। आप यह भी तर्क दे सकते हैं कि LINQ वाली दुनिया में, इसके साथ शुरू करना अधिक मुहावरेदार है ... लेकिन यह ConvertAllविकल्प के बारे में कम से कम जागरूक होने के लायक है।


1
पहले तो मुझे नहीं लगा कि मैं ऐसा कर सकता हूं, क्योंकि मैं एक ienumerable (स्रोत सूची के लिए और यह एक कन्वर्ट विकल्प प्रदान नहीं करता है) के साथ काम कर रहा था, इसलिए मैंने इस पर .ToList () कहा और अब मैं कन्वर्टॉल की कोशिश कर रहा हूं - i एक गैर-फ़िल्टरिंग 'जहाँ' में डालने से बेहतर है कि जैसे
स्ट्रैटन

2
आपको कहां की आवश्यकता होगी? यदि आपको केवल मिल गया है IEnumerable<T>तो बस कॉल करें Selectऔर ToListजेरेड के उत्तर के अनुसार।
जॉन स्कीट

मेरे जैसे अन्य x => buildTargetType(x)
न्यूबियों के लिए

55
var target = origList.ConvertAll(x => (TargetType)x);

1
यह वाक्य रचना क्या है? यह एक भेड़ का बच्चा नहीं है। कुछ प्रलेखन लिंक की सराहना की जाएगी। धन्यवाद हालांकि, यह यहाँ ठीक काम करता है
पियरे डे LESPINAY

ConvertAll का तर्क एक नियमित C # लैम्ब्डा है, है ना?
avl_sweden

1
अच्छा लग रहा है, लेकिन जब (या यदि) यह इस्तेमाल किया जा सकता है चारों ओर कुछ संदर्भ की जरूरत है। मैं सिर्फ यह कोशिश की है और एक हो रही थी cannot cast expressionअपवाद
कोलिन एम बैरेट

31
List<target> targetList = new List<target>(originalList.Cast<target>());

5
-1 यह तभी काम करेगा जब कास्टिंग संभव हो और ओपी के मामले में ऐसा प्रतीत हो।
माइक जोबरे

उम्मीद के मुताबिक काम करता है! सूची <ऑब्जेक्ट> को सूची में बदलने की आवश्यकता <RealType>
एलो

20

मेरा मानना ​​है कि कुछ इस तरह काम करना चाहिए:

origList.Select(a => new TargetType() { SomeValue = a.SomeValue});

1
आपको .ToList()अंत में जोड़ने की आवश्यकता है , अन्यथा यह बस एक IEnumerable प्रदान करेगा।
मैटीडी

10

यहाँ एक सरल उदाहरण है ..

List<char> c = new List<char>() { 'A', 'B', 'C' };

List<string> s = c.Select(x => x.ToString()).ToList();

1
बहुत बढ़िया ... बिल्कुल वही जिसकी मुझे तलाश थी! ठीक नहीं बिल्कुल ... मैं सूची में प्रत्येक तत्व की एक संपत्ति चाहता था, लेकिन आपने मुझे बहुत दूर तक स्क्रॉल किए बिना लांबा वाक्यविन्यास दिया। ;)
14


3

मान लें कि आपके पास कई गुण हैं जिन्हें आप कनवर्ट करना चाहते हैं।

public class OrigType{
    public string Prop1A {get;set;}
    public string Prop1B {get;set;}
}

public class TargetType{
    public string Prop2A {get;set;}
    public string Prop2B {get;set;}
}

var list1 = new List<OrigType>();
var list2 = new List<TargetType>();

list1.ConvertAll(x => new OrigType { Prop2A = x.Prop1A, Prop2B = x.Prop1B })

2

या के साथ एक constructorऔर linqके साथ Select:

public class TargetType {
  public string Prop1 {get;set;}
  public string Prop1 {get;set;}

  // Constructor
  public TargetType(OrigType origType) {
    Prop1 = origType.Prop1;
    Prop2 = origType.Prop2;
  }
}

var origList = new List<OrigType>();
var targetList = origList.Select(s=> new TargetType(s)).ToList();  

Linqलाइन अधिक नरम है! ;-)


0

यदि आप का उपयोग करने के लिए एक समारोह का उपयोग करने की जरूरत है:

var list1 = new List<Type1>();
var list2 = new List<Type2>();

list2 = list1.ConvertAll(x => myConvertFuntion(x));

मेरा कस्टम फ़ंक्शन कहां है:

private Type2 myConvertFunction(Type1 obj){
   //do something to cast Type1 into Type2
   return new Type2();
}

0

इसी प्रकार के वर्ग के लिए।

List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));


आपका बहुत बहुत धन्यवाद। यह सर्वर के लिए नरक के रूप में महंगा है और यह सर्वोत्तम प्रथाओं के अनुसार नहीं है, लेकिन शानदार तरीके से काम करता है। मैंने इसका उपयोग EF डेटाबेस को पहली कक्षाओं में परिवर्तित करने के लिए किया था जब कई प्रक्रियाएँ समान 5 कॉलमों को वापस लौटाती हैं, केवल प्रक्रियाओं में अलग-अलग "जहाँ क्लॉस" के लिए। मुझे पता है कि मुझे डेटाबेस पर टेबल प्रकार बनाना चाहिए था, लेकिन मैं उस का डिज़ाइनर नहीं था ..
jo1storm

-1

यदि प्रकार सीधे डाले जा सकते हैं तो यह इसे करने का सबसे साफ तरीका है:

var target = yourList.ConvertAll(x => (TargetType)x);

यदि प्रकार सीधे नहीं डाले जा सकते हैं तो आप मूल प्रकार से गुण को लक्ष्य प्रकार में मैप कर सकते हैं।

var target = yourList.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });

-1

हम विचार करेंगे कि पहले सूची प्रकार स्ट्रिंग है और इसे पूर्णांक प्रकार की सूची में परिवर्तित करना चाहते हैं।

List<String> origList = new ArrayList<>(); // assume populated

मूल सूची में मान जोड़ें।

origList.add("1");
origList.add("2");
    origList.add("3");
    origList.add("4");
    origList.add("8");

पूर्णांक प्रकार की लक्ष्य सूची बनाएँ

List<Integer> targetLambdaList = new ArrayList<Integer>();
targetLambdaList=origList.stream().map(Integer::valueOf).collect(Collectors.toList());

ForEach का उपयोग करके सूची मूल्यों को प्रिंट करें:

    targetLambdaList.forEach(System.out::println);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.