সি # তে একক আইটেমের তালিকা তৈরির জন্য শর্টকাট


134

সি # তে, কেবল একটি আইটেমের সাথে একটি তালিকা <টি> ইনস্ট্যান্ট করার জন্য কোনও ইনলাইন শর্টকাট রয়েছে।

আমি বর্তমানে করছি:

new List<string>( new string[] { "title" } ))

এই কোডটি সর্বত্র থাকা পঠনযোগ্যতা হ্রাস করে। আমি এই জাতীয় কোনও ইউটিলিটি পদ্ধতি ব্যবহার করার কথা ভেবেছি:

public static List<T> SingleItemList<T>( T value )
{
    return (new List<T>( new T[] { value } ));
}

সুতরাং আমি করতে পারি:

SingleItemList("title");

একটি ছোট / ক্লিনার উপায় আছে?

ধন্যবাদ।

উত্তর:


245

কেবল এটি ব্যবহার করুন:

List<string> list = new List<string>() { "single value" };

এমনকি আপনি () বন্ধনীগুলি বাদ দিতে পারেন:

List<string> list = new List<string> { "single value" };

আপডেট: অবশ্যই এটি একাধিক প্রবেশের জন্যও কাজ করে:

List<string> list = new List<string> { "value1", "value2", ... };

5
প্রথম বিকল্পের প্রথম
বন্ধনে

5
ডিফল্টটি 4 টির শেষ হয়, আমি বিশ্বাস করি: নতুন তালিকা <স্ট্রিং> Hello "হ্যালো"}। ক্ষমতা == 4
জন স্কিটি

39
var list = new List<string>(1) { "hello" };

অন্যরা যা পোস্ট করেছে তার সাথে খুব মিল, এটি প্রাথমিকভাবে কেবলমাত্র একক আইটেমের জন্য স্থান বরাদ্দ করা নিশ্চিত করে।

অবশ্যই, যদি আপনি জানেন তবে আপনি পরে একগুচ্ছ জিনিস যোগ করবেন এটি কোনও ভাল ধারণা নাও হতে পারে তবে এটি একবার উল্লেখ করার পরেও মূল্যবান।


ধারণক্ষমতা এক সেট। আমি এই পৃষ্ঠায় চারটি জনের পক্ষে ভোট দিয়েছি জোন স্কিটের দু'টিই সহ তবে আমি এটিকে সবচেয়ে সঠিক বলে মনে করি।
একাকী কোডার

28

এক্সটেনশন পদ্ধতিগুলি ব্যবহারের বিষয়ে মাইকের ধারণাটি আরও সহজ কিছুকে নিয়ে যায়:

public static List<T> InList<T>(this T item)
{
    return new List<T> { item };
}

সুতরাং আপনি এটি করতে পারে:

List<string> foo = "Hello".InList();

আমি এটি পছন্দ করি বা না তা নিশ্চিত নই, মনে মনে ...


1
আমি এটি পছন্দ করি তাও নিশ্চিত নই: এটি স্ট্রিং টাইপের (উদাহরণস্বরূপ) কোনও "অদ্ভুত" এক্সটেনশন নয়?
এম

1
আমি আপনার বইটিতে এটি এখনও এক্সটেনশন পদ্ধতিতে তৈরি করতে পারি নি, জন :-) এটি একরকম অদ্ভুত বলে মনে হয় তবে এটির ইউটিলিটি আমার পছন্দ হয়। ধন্যবাদ মার্টিন এবং জন।
রায়ান ইসছে 20'08

2
@ মার্টিন: এটি প্রতিটি ধরণের এক অদ্ভুত এক্সটেনশন । এটি সাধারণত নিরুৎসাহিত করা হয় তবে এটি একটি আকর্ষণীয় সাধারণ ধারণা।
জন স্কিটি

4
এটি কিছু অভ্যন্তরীণ ডোমেন নির্দিষ্ট ভাষা ব্যবহার করে, বিশেষত মান প্রকারের সাথে। উদাহরণস্বরূপ নিন: ঘড়ি.এলার্টউজার.আইন (১.মিনিট) ঘড়ির চেয়ে অনেক ভাল পড়তে পারে ler
মাইকেল Meadows

17

গুগল জাভা সংগ্রহগুলির এক্সপোজারের ভিত্তিতে আমার আগের উত্তরটির আলাদা উত্তর :

public static class Lists
{
    public static List<T> Of<T>(T item)
    {
        return new List<T> { item };
    }
}

তারপর:

List<string> x = Lists.Of("Hello");

আমি জিজেসি চেক করার পরামর্শ দিচ্ছি - এতে প্রচুর আকর্ষণীয় স্টাফ পাওয়া গেছে ( ।)



7

পদ্ধতি চেইন সহ একটি এক্সটেনশন পদ্ধতি ব্যবহার করুন।

public static List<T> WithItems(this List<T> list, params T[] items)
{
    list.AddRange(items);
    return list;
}

এটি আপনাকে এটি করতে দেয়:

List<string> strings = new List<string>().WithItems("Yes");

অথবা

List<string> strings = new List<string>().WithItems("Yes", "No", "Maybe So");

হালনাগাদ

আপনি এখন তালিকা আরম্ভকারী ব্যবহার করতে পারেন:

var strings = new List<string> { "This", "That", "The Other" };

Http://msdn.microsoft.com/en-us/library/bb384062(v=vs.90).aspx দেখুন


হতে পারে এটি ২০০৯ সাল থেকে সি # এর নতুন সংস্করণগুলির কারণে, তবে আমি new List<string> {"Yes"}আরও ভাল বলে মনে করি ...?
এরিক

@ErikE মাইক্রোসফট ডকুমেন্টেশন (মতে msdn.microsoft.com/en-us/library/bb384062(v=vs.90).aspx ) এই ভিসুয়াল স্টুডিও 2008 সালে সমর্থন করেন আমি যে মনে করতে পারেন না পর্যন্ত ফিরে নিশ্চিতভাবেই যদি বলতে আমি এই সময়ে অত্যধিক জটিল। আপডেট করা হচ্ছে।
মাইকেল Meadows

7

"সি # /। নেট লিটল আশ্চর্য" এ পাওয়া গেলেও অন্য একটি উপায় (দুর্ভাগ্যক্রমে, সাইটটির আর অস্তিত্ব নেই):

Enumerable.Repeat("value",1).ToList()

বিভ্রান্তিকর তবে চালাক
PRMan

4

জাভাতে গণনাযোগ্য একটি আইটেমের জন্য এটি কালেকশনস.সেসলেটন ("স্ট্রিং") হবে;

সি # এ এটি একটি নতুন তালিকার চেয়ে আরও কার্যকর হতে চলেছে:

public class SingleEnumerator<T> : IEnumerable<T>
{
    private readonly T m_Value;

    public SingleEnumerator(T value)
    {
        m_Value = value;
    }

    public IEnumerator<T> GetEnumerator()
    {
        yield return m_Value;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        yield return m_Value;
    }
}

তবে ফ্রেমওয়ার্কটি ব্যবহার করে কি আরও সহজ উপায় আছে?


এটি আসলে আমার মতে সেরা উত্তর। বরাদ্দের আকার হ্রাস করার জন্য একটি একক আইটেমের তালিকা থাকা খুব সাধারণ প্যাটার্ন। আপনি যদি ইতিমধ্যে একটি শর্টকাট সন্ধান করছেন তবে আপনি ভালের সাথে সুবিধাজনকটিকে একত্রিত করতে পারেন।
অ্যালেক্স


2

আমি এই সামান্য ফাংশন পেয়েছি:

public static class CoreUtil
{    
    public static IEnumerable<T> ToEnumerable<T>(params T[] items)
    {
        return items;
    }
}

যেহেতু এটি একটি কংক্রিট রিটার্নের টাইপ দেয় না এটি এতোই জেনেরিক যে আমি এটি সমস্ত জায়গাতেই ব্যবহার করি। আপনার কোড মত লাগবে

CoreUtil.ToEnumerable("title").ToList();

তবে অবশ্যই এটিও অনুমতি দেয়

CoreUtil.ToEnumerable("title1", "title2", "title3").ToArray();

আমি প্রায়শই এটি ব্যবহার করি যখন আমাকে একটি লিনকিউ স্টেটমেন্টের আউটপুটে একটি আইটেম যুক্ত / প্রিপেন্ড করতে হয়। উদাহরণস্বরূপ একটি নির্বাচন তালিকায় একটি ফাঁকা আইটেম যুক্ত করুন:

CoreUtil.ToEnumerable("").Concat(context.TrialTypes.Select(t => t.Name))

কয়েকটি ToList()এবং Addবিবৃতি সংরক্ষণ করে ।

(দেরিতে উত্তর, কিন্তু আমি এই বৃদ্ধাকে হোঁচট খেয়েছি এবং ভেবেছিলাম এটি সহায়ক হতে পারে)



2

অন্যান্য উত্তরের দ্বারা অনুপ্রাণিত (এবং তাই যখনই আমার প্রয়োজন হবে আমি এটি তুলতে পারি!), তবে নামকরণ / স্টাইলটি এফ # এর সাথে প্রান্তিককরণের সাথে (এতে singletonপ্রতিটি ডাটা স্ট্রাকচারের একটি স্ট্যান্ডার্ড ফাংশন রয়েছে):

namespace System.Collections.Generic
{
    public static class List
    {
        public static List<T> Singleton<T>(T value) => new List<T>(1) { value };
    }
}

* ResizeArrayঅবশ্যই নিজের জন্য বাদে , তাই এই প্রশ্ন :)


বাস্তবে আমি আসলে এটির নাম Createঅন্যান্য সাহায্যকারী আমি যেমন সংজ্ঞায়িত সঙ্গে সারিবদ্ধ Tuple.Create, Lazy.Create[2], LazyTask.Createইত্যাদি:

namespace System.Collections.Generic
{
    public static class List
    {
        public static List<T> Create<T>(T value) => new List<T>(1) { value };
    }
}

[2]

namespace System
{
    public static class Lazy
    {
        public static Lazy<T> Create<T>(Func<T> factory) => new Lazy<T>(factory);
    }
}

ধন্যবাদ! আমার সমাধানও। দু'টি জিনিস: (1) আপনার তালিকা বাস্তবায়ন সর্বজনীন নয়, সুতরাং এটি ঘোষক সমাবেশের বাইরে ব্যবহার করা যাবে না, এবং (২) সিস্টেমের নামস্থানে এগুলি পূরণ করার উদ্দেশ্য কী?
কোডার

@ স্টেফেনরবিনসন এই Lazyএক্সটেনশানটি রাখার কারণ Systemহ'ল এটি Lazyনিজেই রয়েছে System[এবং তাই Createএটি ছাড়াই সম্পূর্ণরূপে তালিকায় উপস্থিত হবে using]। লোককে আলাদা আলাদা আলাদা আলাদা জায়গায় নামানো থেকে কোনও লাভ হয় না open? অন্য জিনিস ব্যক্তিগত করা ইচ্ছাকৃত ছিল না; স্থির
রুবেন বারটেলিংক

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