সি # তে তালিকার প্রথম এন উপাদানগুলি কীভাবে পাবেন?


384

আমি আমার প্রকল্পের একটি বাসের সময়সূচী জিজ্ঞাসা করতে লিনকটি ব্যবহার করতে চাই, যাতে যে কোনও সময় আমি পরবর্তী 5 টি বাসের আগমনের সময় পেতে পারি। আমি আমার জিজ্ঞাসাটি প্রথম 5 টি ফলাফলের মধ্যে কীভাবে সীমাবদ্ধ রাখতে পারি?

আরও সাধারণভাবে, আমি কীভাবে সি # তে তালিকার একটি টুকরো নিতে পারি? (পাইথনে আমি mylist[:5]প্রথম 5 উপাদান পেতে ব্যবহার করব ।)

উত্তর:


706
var firstFiveItems = myList.Take(5);

অথবা স্লাইস করতে:

var secondFiveItems = myList.Skip(5).Take(5);

এবং অবশ্যই প্রায়শই কোনও ধরণের ক্রম অনুসারে প্রথম পাঁচটি আইটেম পাওয়া সুবিধাজনক:

var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);

87
কেবলমাত্র উদাহরণস্বরূপ তালিকায় 3 টি আইটেম থাকলে এটি কি ব্যতিক্রম ছুঁড়ে ফেলে? বা 5 টি পর্যন্ত যতগুলি লাগবে?
— bobek

87
@ ববেক: এটি ব্যতিক্রম হয় না। পর্যাপ্ত উপাদান না থাকলে এটি কেবল যা দেয় তা ফিরিয়ে দেয়।
— জোশুয়া পেচ

1
ঠিক যেমন, কোনও ব্যতিক্রম ছাড়ুন এবং ছেড়ে যান একসাথে আমার সমস্যার সমাধান করায় আমি চেয়েছিলাম যে কোনও জেনেরিক সংগ্রহ এবং ব্যাচের প্রতি এক্স আইটেমগুলি প্রক্রিয়া করতে
— জোহানলারসন

এটি লক্ষ্য করা উচিত যে .Take(n)একটি টেকটাইজারকে ফেরত দেয়; এটি এতে nউপাদানগুলির সাথে একটি তালিকা ফেরত দেয় না (ধরে নেওয়া যায় যে অনেকগুলি উপলব্ধ।) একটি কংক্রিট অ্যারে বা তালিকা পেতে ফলাফল .ToArray()বা ব্যবহারের .ToList()ফলাফল on Take
— অ্যান্ড্রু ওয়েব

69

যদি কেউ আগ্রহী হন (এমনকি যদি প্রশ্নটি এই সংস্করণটির জন্য জিজ্ঞাসা না করে), C # 2 তে হবে: (আমি উত্তরটি সম্পাদনা করেছি, কিছু পরামর্শ অনুসরণ করে)

myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);

পাশাপাশি একটি বেনামে শিকার হিসাবে যুক্ত করতে পারেন?
— আলেক্সিএমকে

2
তালিকা <টি>। বাছাই অকার্যকর; আপনার বাছাই করতে হবে, তারপরে পৃথকভাবে getRange ব্যবহার করুন। আপনি CLASS_FOR_COMPARER এর প্রয়োজনীয়তা অপসারণ করতে একটি তুলনা <T> বেনামে পদ্ধতিও ব্যবহার করতে পারেন।
— মার্ক গ্র্যাভেল

@ অ্যালেক্সিএমকে - আপনার অর্থ তুলনা <T>, প্রিডিকেট নয় (ভবিষ্যদ্বাণী করা <T>) - ডেটা ফিল্টার করতে একটি প্রিডিকেট ব্যবহৃত হয়
— মার্ক গ্র্যাভেল

আমি বিশ্বাস করি যে এই উত্তরটি এখনও 10 বছর এবং অনেক সি # সংস্করণ পরে কার্যকর। নির্দিষ্ট ক্ষেত্রে যেখানে আপনার একটি তালিকা রয়েছে For বিশেষত যদি আপনি অনেকগুলি আইটেম বাদ দেন। যেমন আপনার দশ মিলিয়ন আইটেমের একটি তালিকা রয়েছে এবং আপনি সেগুলির মধ্যে 5 টির একটি স্লাইস চান, তালিকার বাইরে। এগুলি ধরতে কোথায় যেতে হবে তা getRange জানে। আমি জানি না যে Skip+ + Takeতত স্মার্ট কিনা, বা এড়িয়ে যাওয়া আইটেমগুলির উপরে এটি গণনা করে। এবং আমার জানার দরকার নেই - আমি কেবল getRange ব্যবহার করি (যখন কোনও তালিকা দেওয়া হয়)। কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি বুঝতে পেরেছেন দ্বিতীয় প্যারামিটারটি গণনা করা ( শেষ সূচকের চেয়ে )।
— নির্মাতা স্টিভ

সুন্দর জিনিসটি .Take(n)হ'ল এটি যে nক্রম অনুসারে চলমান উপাদানগুলির চেয়ে কম রয়েছে তা আপনার চিন্তার দরকার নেই। সমস্যাটি List<T>.GetRange(0, count)হ'ল আপনাকে চিন্তা করতে হবে .... আইটেম ArgumentExceptionনা থাকলে আপনি একটি পাবেন count।
— অ্যান্ড্রু ওয়েব

5

যেমন paginationআপনি নেওয়ার জন্য নীচের সূত্র ব্যবহার করতে পারেনslice of list or elements :

var slice = myList.Skip((pageNumber - 1) * pageSize)
                  .Take(pageSize);

উদাহরণ 1: প্রথম পাঁচটি আইটেম

var pageNumber = 1;
var pageSize = 5;

উদাহরণ 2: দ্বিতীয় পাঁচটি আইটেম

var pageNumber = 2;
var pageSize = 5;

উদাহরণ 3: তৃতীয় পাঁচটি আইটেম

var pageNumber = 3;
var pageSize = 5;

যদি পরামিতিগুলি সূত্রের বিষয়ে লক্ষ্য করে pageSize = 5এবং pageNumberপরিবর্তন হয় তবে আপনি যদি স্লাইসিংয়ে আইটেমের সংখ্যা পরিবর্তন করতে চান তবে আপনি পরিবর্তন করুন pageSize।


1

প্রথম 5 টি উপাদানগুলির মতো এটির মতো আরও ভাল ব্যবহার করতে:

var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5);

অথবা

var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5).OrderBy([ORDER EXPR]);

এটি অর্ডার বাই বৈকল্পের চেয়ে দ্রুততর হবে, কারণ দেরী কার্যকর হওয়ার কারণে লিনকুই ইঞ্জিন সমস্ত তালিকা ট্রট স্ক্যান করবে না এবং সমস্ত অ্যারে বাছাই করবে না।

class MyList : IEnumerable<int>
{

    int maxCount = 0;

    public int RequestCount
    {
        get;
        private set;
    }
    public MyList(int maxCount)
    {
        this.maxCount = maxCount;
    }
    public void Reset()
    {
        RequestCount = 0;
    }
    #region IEnumerable<int> Members

    public IEnumerator<int> GetEnumerator()
    {
        int i = 0;
        while (i < maxCount)
        {
            RequestCount++;
            yield return i++;
        }
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    #endregion
}
class Program
{
    static void Main(string[] args)
    {
        var list = new MyList(15);
        list.Take(5).ToArray();
        Console.WriteLine(list.RequestCount); // 5;

        list.Reset();
        list.OrderBy(q => q).Take(5).ToArray();
        Console.WriteLine(list.RequestCount); // 15;

        list.Reset();
        list.Where(q => (q & 1) == 0).Take(5).ToArray();
        Console.WriteLine(list.RequestCount); // 9; (first 5 odd)

        list.Reset();
        list.Where(q => (q & 1) == 0).Take(5).OrderBy(q => q).ToArray();
        Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
    }
}

25
আপনি এখন প্রথম 5 টি উপাদান নির্বাচিত করার পরে কেবল অর্ডার করছেন। এটি দ্রুততর হতে পারে তবে এর বিভিন্ন শব্দার্থবিজ্ঞানও রয়েছে, যা লোকেরা আসলে কী অর্জন করতে চায় তার সম্ভাবনা কম।
— গ্রেগ বিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.