একটি একক মান থেকে একটি নতুন IEnumerable <T> ক্রম তৈরির প্রিয় উপায়?


98

আমি সাধারণত অ্যারে সিনট্যাক্স ব্যবহার করে একটি মান থেকে একটি ক্রম তৈরি করি:

IEnumerable<string> sequence = new string[] { "abc" };

অথবা একটি নতুন তালিকা ব্যবহার করে। কারও কাছে একই জিনিসটি করার মতো আরও স্পষ্টভাবে উপায় আছে কিনা তা আমি শুনতে চাই।


4
কিভাবে এটি একটি খালি ক্রম?
— কোডারডেনিস

এটি কেবল বিব্রতকর যে ডটনেট এর মতো কিছু এখনও নেই Enumerable.From<T>(params T[] items)।
— গুড নাইট নার্ড প্রাইড

উত্তর:


145

আপনার উদাহরণটি খালি ক্রম নয়, এটি একটি উপাদান সহ একটি ক্রম। আপনি করতে পারেন তারের খালি ক্রম তৈরি করতে

var sequence = Enumerable.Empty<string>();

এডিটি ওপি স্পষ্ট করে জানিয়েছে যে তারা একটি একক মান তৈরি করতে চাইছে । এই ক্ষেত্রে

var sequence = Enumerable.Repeat("abc",1);

দোহ, আমি বিরক্ত হয়েছি, দুঃখিত। আমার অর্থ একটি একক মান থেকে তৈরি করা, খালি উদাহরণ তৈরি করা নয়!
— মার্সেল ল্যামোথ

এটাই কি 'উত্তর' পতাকা?
— n8wrl

এই পদ্ধতিটি নতুন অ্যারে তৈরি করার চেয়ে খাঁটিভাবে কার্যকরী।
— রায় টিঙ্কার

69

আপনার পরামর্শ মত আমি পছন্দ করি তবে এ্যারে টাইপ বাদ দিয়ে:

var sequence = new[] { "abc" };

4
আমি কখনই বুঝতে পারি নি যে আপনি এটি করতে পারেন। আমি মনে করি এটি পুনরাবৃত্তি ব্যবহারের চেয়ে পরিষ্কার।
— মার্সেল ল্যামোথ

4
তবে এটি একটি অনুমিত নয়, এটি একটি অ্যারে!
— জোডম্যান

4
@ ব্রায়ান ওয়াটস আমি এটি জানি, তবে এটি একটি আইনিউমারেবলের একটি কংক্রিট বাস্তবায়ন। প্রশ্নটি একটি অনুমিত <> (উদাহরণ না হলেও) এর জন্য জিজ্ঞাসা করছে isn't একটি পার্থক্য আছে।
— জোডম্যান

প্রশ্নটি পরিবর্তন করা উচিত।
— জোডম্যান

4
@ জোন্সোপলিস: এটি একটি ভিন্ন, সম্পর্কিত নয়। আপনি এটি Task.FromResultঅর্জন করতে ব্যবহার করতে পারেন ।
— ব্রায়ান ওয়াটস

22

বা আরও ছোট,

string[] single = { "abc" };

আমি একটি এক্সটেনশন পদ্ধতি তৈরি করব:

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

বা আরও ভাল এবং খাটো, ঠিক

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

সম্ভবত Enumerable.Repeatএটি হুডের নীচে ঠিক করছে।


4
শেষটি উজ্জ্বল। নাম বাদে ... এটি ইতিমধ্যে আপনার উদাহরণের স্ট্রিংয়ের মতো ইতিবাচক বাস্তবায়নকারী ধরণের সাথে বিরোধ করবে। .SSingleItemEnumerable (), বা সহজভাবে ব্যবহার করুন। ফলন () -> "abc"। ফলন ()
— ড্যানো

8
আমি মনে করি ToEnumerable আরও উপযুক্ত।
— জোডম্যান

4
+1 Yieldভাল। আমিও বানিয়েছি IEnumerable<T> Yield<T>(this T source, params T[] others)।
— জোডরেল

আমি লাম্বদার পক্ষে পুরোপুরি ফলন শেষ করে দেওয়ার চেষ্টা করেছি কিন্তু কোনওরকম এটি কখনও সংকলিত হয়নি ... সিএফ. stackoverflow.com/questions/1217729/… ;-)।
— পিটার - মনিকা

@ পিটারস্কিনিডার আপনি কীভাবে এবং কেন এটি করেছিলেন? কোড না দেখে মন্তব্য করতে পারছি না। আমি আপনাকে অনুসরণ করি বলে মনে হয় না।
— নওফাল

5

অথবা কেবল একটি পদ্ধতি তৈরি করুন

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

বা

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

ব্যবহার:

IEnumerable<string> items = CreateEnumerable("single");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.