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


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.