<T> এবং আইনিম্যুয়াল <T> তালিকার মধ্যে অবাধে রূপান্তর করুন


103

আমি কিভাবে রূপান্তর করতে পারেন List<MyObject>একটি থেকে IEnumerable<MyObject>তারপর ফিরে আবার এবং?

আমি তালিকায় লিনকিউ স্টেটমেন্টের একটি সিরিজ চালানোর জন্য এটি করতে চাই, যেমন Sort()


এটি এই প্রশ্নের স্টকওভারফ্লো.com
জন

উত্তর:


148
List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();

30
তবে সাবধান থাকুন যে মাইইনুম্যারেবলটি মাইলিস্টের মতো একই বস্তু উদাহরণ, তবে তালিকাগুলি আমার গণনার মতো একই বস্তুর উদাহরণ নয়। আপনি কী করতে চান এবং আমার গণনীয় কী তার উপর নির্ভর করে "তালিক <string> listAgain = তালিকা <স্ট্রিং> হিসাবে উল্লেখযোগ্য;" আরও ভাল হতে পারে।
ক্রিসডাব্লু 23'09

1
ক্রিশ: ওহ হ্যাঁ, আপনি অবশ্যই ঠিক আছেন, তবে আইনিউনামেবল <T> ইন্টারফেসটি অপরিবর্তনীয় তাই এটি সেই দিক থেকে সমস্যা তৈরি করবে না এবং যখন আপনার কোনও ফাংশন থাকবে যা টাইপ সুরক্ষার যত্ন নেবে তখন কেবল নোংরা বোধ করবে।
তামাস সিজনেজ

1
আপনি কেবলমাত্র মূল মাইলিস্ট অবজেক্টটি ব্যবহার করতে পারেন। (আমি আমি সত্যিই প্রশ্ন পাবেন না অনুমান)
হেলায়

6
এটা ঠিক যে যদি সে মাইলিস্ট সম্পাদনা করে তবে সে আমার গণ্য সম্পাদনা করবে, তবে যদি তিনি তালিকা সম্পাদনা করেন তবে তিনি আমার সংখ্যা সম্পাদনা করবেন না।
ক্রিসডাব্লু

15
ভুলে যাবেন না using System.Linq;বা আপনি টোললিস্ট করতে পারবেন না ()
জেসন

21

একটি List<T>একটি হল IEnumerable<T>'রূপান্তর' একটি করার কোন প্রয়োজন নেই, তাই আসলে List<T>একটি করতে IEnumerable<T>। যেহেতু a List<T>হয় একটি IEnumerable<T>, আপনি কেবলমাত্র List<T>একটি ভেরিয়েবলকে টাইপ করতে পারেন IEnumerable<T>

অন্যান্য উপায় কাছাকাছি, না যে IEnumerable<T>একটি হল List<T>offcourse, অতএব আপনাকে কল করতে হবে ToList()সদস্য পদ্ধতি IEnumerable<T>


4
প্রযুক্তিগতভাবে, টোলিস্টটি সিস্টেমের একটি সদস্য পদ্ধতি.লিনক.আনুনেবল
অ্যামি বি

2
আমি মনে করি আপনি ডেভিড যেমন বলেছেন ঠিক তেমনই আপনি তালিকায় IEnumerable কাস্ট করতে পারেন।
আবাটিশচেভ

9

List<T>ইতিমধ্যে একটি IEnumerable<T>, সুতরাং আপনি সরাসরি আপনার List<T>পরিবর্তনশীলতে লিনকিউ স্টেটমেন্ট চালাতে পারেন ।

আপনি যদি লিনকিউ এক্সটেনশন পদ্ধতিগুলি না দেখেন তবে OrderBy()আমি অনুমান করছি যে এটি using System.Linqআপনার উত্স ফাইলে কোনও নির্দেশনা নেই।

আপনাকে লিনকিউ এক্সপ্রেশন ফলাফলকে List<T>স্পষ্টভাবে আবার রূপান্তর করতে হবে , যদিও:

List<Customer> list = ...
list = list.OrderBy(customer => customer.Name).ToList()

"আপনি যদি অর্ডারবাইয়ের মতো লিনকিউ এক্সটেনশন পদ্ধতিগুলি না দেখেন ()" এটি আমার সমস্যা ছিল, আপনাকে ধন্যবাদ।
রায়পপ

5

একদিকে: নোট করুন যে স্ট্যান্ডার্ড লিনকিউ অপারেটরগুলি (পূর্ববর্তী উদাহরণ অনুসারে) বিদ্যমান তালিকাটি পরিবর্তন করে না - list.OrderBy(...).ToList()পুনঃ অর্ডার করা ক্রমের ভিত্তিতে একটি নতুন তালিকা তৈরি করবে। তবে এটি একটি এক্সটেনশন পদ্ধতি তৈরি করা বেশ সহজ যা আপনাকে ল্যাম্বডাস এর সাথে ব্যবহার করতে দেয় List<T>.Sort:

static void Sort<TSource, TValue>(this List<TSource> list,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    list.Sort((x,y) => comparer.Compare(selector(x), selector(y)));
}

static void SortDescending<TSource, TValue>(this List<TSource> list,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    list.Sort((x,y) => comparer.Compare(selector(y), selector(x)));
}

তারপরে আপনি ব্যবহার করতে পারেন:

list.Sort(x=>x.SomeProp); // etc

এটি বিদ্যমান তালিকাকে একইভাবে আপডেট করে যা List<T>.Sortসাধারণত হয়।


এই বিবৃতিতে সামান্য সংশোধন: মানক লিনকিউ অপারেটরগুলি বিদ্যমান তালিকাটি পরিবর্তন করে না; পরিবর্তে, তারা একটি নতুন আইনিউমেন্টেবল তৈরি করে যার মধ্যে তাদের কাজ করার জন্য প্রয়োজনীয় যুক্তি রয়েছে। যাইহোক, আইইনুমরেটরকে অনুরোধ করা না হওয়া পর্যন্ত এই যুক্তিটি আসলে কার্যকর করা হয় না।
ভোজিস্লাভ স্টোজকোভিক 13

@ ভোজিস্লাভ - আমার আগের উদাহরণটির প্রসঙ্গটি ছিল যার সমাপ্তি ToListহবে - তবে আমি স্পষ্ট করে বলব।
মার্ক Gravell

1

রূপান্তরিত List<T>হচ্ছেIEnumerable<T>

List<T>প্রয়োগগুলি IEnumerable<T>(এবং এর মতো আরও অনেকগুলি IList<T>, ICollection<T>) অতএব, কোনও তালিকাই ইতিমধ্যে একটি হিসাবে রূপান্তরিত করার দরকার নেই কারণ এটি ইতিমধ্যে একটি IEnumerable<T>

উদাহরণ:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Person person1 = new Person() { Id = 1, Name = "Person 1" };
Person person2 = new Person() { Id = 2, Name = "Person 2" };
Person person3 = new Person() { Id = 3, Name = "Person 3" };

List<Person> people = new List<Person>() { person1, person2, person3 };

//Converting to an IEnumerable
IEnumerable<Person> IEnumerableList = people;

আপনি Enumerable.AsEnumerable()পদ্ধতি ব্যবহার করতে পারেন

IEnumerable<Person> iPersonList = people.AsEnumerable();

রূপান্তরিত IEnumerable<T>হচ্ছেList<T>

IEnumerable<Person> OriginallyIEnumerable = new List<Person>() { person1, person2 };
List<Person> convertToList = OriginallyIEnumerable.ToList();

এটি সত্তা ফ্রেমওয়ার্কে দরকারী ।


0

মেমরিতে অনুলিপি রোধ করতে, পুনরায় ভাগ করা এই পরামর্শ দিচ্ছে:

List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myList as List<string>() ?? myEnumerable.ToList();

.ToList () একটি নতুন অপরিবর্তনীয় তালিকা ফিরিয়ে দেয়। সুতরাং তালিকাগুলিতে পরিবর্তনগুলি @ টামাস সিজনেজ উত্তরে মাইলিস্টকে প্রভাবিত করে না। এটি বেশিরভাগ ক্ষেত্রে কমপক্ষে দুটি কারণে সঠিক: এটি অন্য অঞ্চলে (আলগা দম্পতি) প্রভাবিত করে এক অঞ্চলে পরিবর্তন প্রতিরোধ করতে সহায়তা করে এবং এটি খুব পঠনযোগ্য, যেহেতু আমাদের সংকলক উদ্বেগগুলির সাথে কোড ডিজাইনি করা উচিত নয়।

তবে কয়েকটি দৃষ্টান্ত রয়েছে যেমন কড়া লুপে থাকা বা এম্বেড করা বা লো মেমরি সিস্টেমে কাজ করা, যেখানে সংকলক বিবেচনাগুলি বিবেচনা করা উচিত।

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