IList বা IEnumerable অ্যারেতে রূপান্তর করার সর্বোত্তম উপায়


101

আমার কাছে এইচকিউএল কোয়েরি রয়েছে যা ফলাফলের আইলিস্ট, বা ফলাফলের একটি অনুমিত পরিমাণ তৈরি করতে পারে।

যাইহোক, আমি চাই এটি যে সত্তাটি আমি নির্বাচন করছি তার একটি অ্যারেটি ফিরিয়ে দেওয়া হোক, এটি সম্পাদন করার সর্বোত্তম উপায় কী হবে? আমি হয় এটির মাধ্যমে অঙ্ক করতে পারি এবং অ্যারে তৈরি করতে পারি, বা কপিটো () একটি সংজ্ঞায়িত অ্যারে ব্যবহার করতে পারি।

এর চেয়ে ভাল উপায় আর কি আছে? আমি কপিটো-পদ্ধতির সাথে গিয়েছিলাম।


4
লিনক ছাড়া কারও কি সমাধান আছে ?
বিটারব্লু

উত্তর:


168

.NET এর কোন সংস্করণ আপনি ব্যবহার করছেন? যদি এটি নেট .৩.৫, আমি কেবল কল করেছিলাম ToArray()এটি দিয়ে শেষ করব।

যদি আপনার কাছে কেবল একটি জেনারিক নয়, তবে এই জাতীয় কিছু করুন:

IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();

আপনি যদি সেই পদ্ধতির মধ্যে ধরণটি না জানেন তবে পদ্ধতিটির কলকারীরা এটি জানেন না, তবে পদ্ধতিটিকে সাধারণ করুন এবং এটি ব্যবহার করে দেখুন:

public static void T[] PerformQuery<T>()
{
    IEnumerable query = ...;
    T[] array = query.Cast<T>().ToArray();
    return array;
}

এটি ৩.৫ তবে আইকিউরির একটি টোআরাই নেই, না আইনিউমারবেল বা আইলিস্ট যতদূর আমি বলতে পারি?
জিশি

4
না - কেবলমাত্র একটি এক্সটেনশন পদ্ধতি রয়েছে। (এটি নিজেই ইন্টারফেসের মধ্যে নেই))
জন স্কিটি

4
@ শিম্মি: হ্যাঁ আছে ... অন্য কিছু বাদ দিয়ে, এটি সংকলকটি বলছে যে কী ধরণের অ্যারে আশা করা যায়! আপনি যদি কেবল একটি ন্যায়বিচার object[]ব্যবহার করতে চান Cast<object>। ননজেনেরিকের IEnumerableএকটি ToArrayএক্সটেনশন পদ্ধতি নেই, সুতরাং আপনি কেবল কল করতে পারবেন না foo.ToArray<object>বা এর মতো কিছু।
জন স্কিটে

23
ToArrayএক্সটেনশন পদ্ধতি রয়েছে System.Linqনামস্থান, ভেবেছিলাম যে জানতে :) ভাল হতে পারে।
টমাস জানসন

4
@Alexander: না, যদি না মান হচ্ছে ফিরে সত্যিই হয় একটি যথাযথ অ্যারে।
জন স্কিটি

47

আপনার .cs ফাইলের মধ্যে নিম্নলিখিতটি রাখুন:

using System.Linq;

এরপরে আপনি সিস্টেমটি থেকে নিম্নলিখিত এক্সটেনশন পদ্ধতিটি ব্যবহার করতে সক্ষম হবেন in

public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)

অর্থাৎ

IEnumerable<object> query = ...;
object[] bob = query.ToArray();

আহ ... ইউনিট পরীক্ষা প্রকল্পটি ডিফল্টরূপে লিনককে অন্তর্ভুক্ত করে না। ধন্যবাদ!
zsf222

6

আমি চাকা পুনর্নবীকরণ মত মনে হচ্ছে ...

public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
    if (enumerable == null)
        throw new ArgumentNullException("enumerable");

    return enumerable as T[] ?? enumerable.ToArray();
}

আপনি নিজের উত্তরটি ব্যাখ্যা করতে পারেন এবং আপনি চাকাটি পুনরায় উদ্ভাবন করছেন বলে মনে করছেন বলে আপনি কী বোঝাতে চেয়েছেন?
ক্রিসক্যাম্প

হি - আমি আসলে এ জাতীয় ধরণের: অফ সুযোগটিতে গণনা করা প্রকৃত পক্ষে একটি অ্যারে, আপনি নতুন বরাদ্দ / অনুলিপিটি ToArray()কল ( ধীরে ধীরে অভ্যন্তরীণ Bufferশ্রেণীর মাধ্যমে ) স্টেপগুলিতে রেখে যাচ্ছেন ... যদিও যদি কেউ "মান" আশা করে তবে "কপির আচরণ, তারা বেশ অবাক হবেন।
জেরকিম্বল

@ ক্রিস: কারণ আমি সিস্টেমে টোআরাই () পদ্ধতির স্বাক্ষর দ্বারা অনুপ্রাণিত হয়েছি। msdn.microsoft.com/en-us/library/bb298736.aspx
ফিলিপ ম্যাট্রে

অতিরিক্ত হাস্যকরতার জন্য এই পদ্ধতির প্রয়োগের জন্য কল করা উচিতIEnumerable.ToArray()
দ্য মফিন ম্যান

3

যদি আপনার লিঙ্ক না থাকে তবে আমি এটি নিম্নলিখিত উপায়ে সমাধান করেছি:

    private T[] GetArray<T>(IList<T> iList) where T: new()
    {
        var result = new T[iList.Count];

        iList.CopyTo(result, 0);

        return result;
    }

আশা করি এটা সাহায্য করবে

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