ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে এক ধরণের থেকে অন্য ধরণের অবজেক্টের একটি তালিকা রূপান্তর করুন


224

আমার একটি ফোরচ লুপ রয়েছে একটি ধরণের অবজেক্টের একটি তালিকা পড়ে এবং বিভিন্ন ধরণের অবজেক্টের একটি তালিকা উত্পাদন করে। আমাকে বলা হয়েছিল যে একটি ল্যাম্বডা এক্সপ্রেশন একই ফলাফল অর্জন করতে পারে।

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

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

যে কোনও সাহায্যের প্রশংসা হবে - আমি লাম্বদা এবং লিনক ধন্যবাদ, এস


@ মমক্রয়ে এই প্রশ্নের চেয়ে নতুন প্রশ্ন
অ্যান্ডি

উত্তর:


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। আপনি এই যুক্তিও দিতে পারেন যে লিনকিউ সহ একটি বিশ্বে, এটি শুরু করা আরও বুদ্ধিমানের ... তবে কমপক্ষে ConvertAllবিকল্পটি সম্পর্কে সচেতন হওয়া ভাল ।


1
প্রথমে আমি ভাবিনি যে আমি এটি করতে পারি, কারণ আমি একটি অগণনীয় (উত্স তালিকার জন্য এবং এটি রূপান্তর বিকল্পটি সরবরাহ করে না) নিয়ে কাজ করছিলাম তাই আমি ফোন করেছিলাম .ToList () এর উপরে এবং এখন আমি রূপান্তর করার চেষ্টা করছি - i ফিল্টারবিহীন 'যেখানে' রাখার চেয়ে এটি আরও ভাল
স্ট্র্যাটন

2
আপনার কোথায় দরকার হবে কেন? যদি আপনি কেবল IEnumerable<T>তখনই কল করেন Selectএবং ToListজারেডের উত্তর অনুসারে।
জন স্কিটি

আমার মতো অন্যান্য x => buildTargetType(x)
নবজাতকের

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

1
এই সিনট্যাক্সটি কী? এটি একটি ল্যাম্বদা পুনরায় সংগ্রহ করা হয় না। কিছু ডকুমেন্টেশন লিঙ্ক প্রশংসা করা হবে। ধন্যবাদ যদিও, এটি এখানে দুর্দান্ত কাজ করে
পিয়েরে লেস্পিনে

কনভার্টএলের পক্ষে যুক্তিটি কি নিয়মিত সি # ল্যাম্বডা, তাই না?
avl_wwen

1
দেখতে দুর্দান্ত লাগছে, তবে কখন (বা যদি) এটি ব্যবহার করা যায় তার চারপাশে কিছু প্রসঙ্গের প্রয়োজন। আমি কেবল এটি চেষ্টা করেছিলাম এবং এর cannot cast expressionব্যতিক্রম পাচ্ছি
কলিন এম। ব্যারেট

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

5
-1 এটি কেবল তখনই কাজ করতে পারে যদি ingালাই সম্ভব ছিল এবং ওপিএস ক্ষেত্রে এটি প্রদর্শিত হয়।
মাইক Zboray

প্রত্যাশার মতো কাজ করে! << বিষয়> তালিকাতে <রিয়েলটাইপ>
এলো

20

আমি বিশ্বাস করি এরকম কিছু কাজ করা উচিত:

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

1
.ToList()আপনার শেষে একটি যুক্ত করা দরকার , অন্যথায় এটি কেবল একটি অনুমিত পরিমাণ সরবরাহ করবে।
ম্যাটডি

10

এখানে একটি সাধারণ উদাহরণ ..

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

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

1
দুর্দান্ত ... আমি ঠিক যা খুঁজছিলাম! ঠিক একদম ঠিক নয় ... আমি তালিকার প্রতিটি এলিমেন্টের সম্পত্তি চেয়েছিলাম তবে আপনি খুব বেশি স্ক্রোল না করেই আমাকে ল্যাম্ব সিনট্যাক্স দিয়েছিলেন। ;)
ত্রুটিযুক্ত


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 টি কলাম ফেরত দেয় কেবলমাত্র পদ্ধতিগুলিতে বিভিন্ন "যেখানে ধারা" থাকে। আমি জানি আমার ডাটাবেসে টেবিল টাইপ করা উচিত ছিল, তবে আমি এর ডিজাইনার
নই

-1

যদি প্রকারগুলি সরাসরি castালাই করা যায় তবে এটি করার সর্বোত্তম উপায় এটি:

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

যদি প্রকারগুলি সরাসরি castালাই করা না যায় তবে আপনি মূল ধরণ থেকে লক্ষ্য প্রকারে মানচিত্র তৈরি করতে পারেন।

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());

প্রতিটি ব্যবহার করে মুদ্রণ তালিকার মানগুলি:

    targetLambdaList.forEach(System.out::println);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.