একটি তালিকা <T> থেকে আমি কীভাবে প্রতি নবম আইটেম পেতে পারি?


114

আমি .NET 3.5 ব্যবহার করছি এবং nএকটি তালিকা থেকে প্রতিটি * * ম আইটেম পেতে সক্ষম হতে চাই । ল্যাম্বডা এক্সপ্রেশন বা লিনকিউ ব্যবহার করে এটি অর্জন হয়েছে কিনা তা নিয়ে আমি মাথা ঘামাই না।

সম্পাদন করা

দেখে মনে হচ্ছে এই প্রশ্নটি যথেষ্ট বিতর্ককে উস্কে দিয়েছে (যা একটি ভাল জিনিস, তাই না?) প্রধান জিনিস আমি শিখেছি হ'ল আপনি যখন মনে করেন যে আপনি কিছু করার প্রতিটি উপায় জানেন (এমনকি এটি এত সহজ) তখন আবার চিন্তা করুন!


আমি আপনার মূল প্রশ্নের পিছনে কোনও অর্থ সম্পাদনা করি নি; আমি কেবল এটি পরিষ্কার করেছি এবং মূলধন এবং বিরামচিহ্নগুলি সঠিকভাবে ব্যবহার করেছি। (। নেট মূলধনিত হয়, লিনকুই সর্বক্যাপে থাকে এবং এটি 'ল্যাম্বডা' নয়, এটি 'ল্যাম্বডা এক্সপ্রেশন'))
জর্জ স্টকার

1
আপনি "নিশ্চিত" দিয়ে "ফিউসড" প্রতিস্থাপন করেছেন যা কোনও প্রতিশব্দ নয়।
এমকিপিপি

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

হ্যাঁ, আমি এটি যেমন বুঝতে পেরেছি, ঠিক সেটাই ঠিক।
এমকিপিপি

ফিউসড সম্ভবত "সম্পর্কিত" এর সাথে প্রতিস্থাপন করা সবচেয়ে ভাল হবে যাতে এটি পড়ে "এটি ল্যাম্বডা এক্সপ্রেশন বা লিনকিউ ব্যবহার করে অর্জন করেছে কিনা তা নিয়ে আমি উদ্বিগ্ন নই।"
TheTXI

উত্তর:


189
return list.Where((x, i) => i % nStep == 0);

5
@ ম্যাকুএন্ডার: নোট করুন যে এটি আপনাকে নবম - 1 উপাদানটি দেবে। আপনি যদি প্রকৃত নবম উপাদান চান (প্রথমটি এড়িয়ে যাচ্ছেন) তবে আপনাকে 1 যুক্ত করতে হবে।
ক্যাস্পার ওয়ান

2
হ্যাঁ, আমি মনে করি এটি "nth" দ্বারা আপনি কী বোঝাতে চেয়েছেন তা নির্ভর করে তবে আপনার ব্যাখ্যাটি আরও সাধারণ হতে পারে। আপনার প্রয়োজন অনুসারে আই থেকে বিয়োগ বা বিয়োগ করুন।
এমকিপিপি

5
কেবলমাত্র লক্ষণীয়: লিংক / ল্যাম্বদা দ্রবণ স্থির বর্ধনের সাথে সরল লুপের তুলনায় অনেক কম পারফর্মেন্ট হবে।
মার্টিনস্ট্যাটনার

5
অগত্যা, মুলতুবি কার্যকরকরণের সাথে এটি একটি ফোরচ লুপে ব্যবহৃত হতে পারে এবং একবারে কেবলমাত্র মূল তালিকার উপরে লুপ করে।
স্যামুয়েল

1
এটি "ব্যবহারিক" বলতে কী বোঝায় তা নির্ভর করে depends 30 টি আইটেমের তালিকায় প্রতিটি অন্যান্য আইটেমটি পেতে যদি আপনার কোনও দ্রুত পদ্ধতির প্রয়োজন হয় যখন ব্যবহারকারী একটি বোতাম টিপেন, আমি বলি এটি প্রতিটি ব্যবহারিক হিসাবেই রয়েছে। কখনও কখনও পারফরম্যান্স সত্যিই আর কোন ব্যাপার না। অবশ্যই, কখনও কখনও এটি করে।
এমকিপিপি

37

আমি জানি এটি "পুরাতন স্কুল", তবে কেন কেবল পদক্ষেপ = এন দিয়ে লুপের জন্য ব্যবহার করবেন না?


এটি ছিল মূলত আমার চিন্তাভাবনা।
মার্ক পিম

1
@ মিশেল টড: এটি কাজ করে তবে তার সাথে সমস্যা হ'ল আপনাকে এই কার্যকারিতাটি সর্বত্র নকল করতে হবে। লিনকিউ ব্যবহার করে এটি রচিত ক্যোয়ারির অংশ হয়ে যায়।
ক্যাস্পার ওয়ান

8
@ ক্যাস্পার ওন: আমি বিশ্বাস করি প্রোগ্রামাররা এই বিষয়টিকে মোকাবেলা করার জন্য সাবরুটাইনস নামে এই জিনিসটি আবিষ্কার করেছিলেন;) একটি বাস্তব প্রোগ্রামে আমি সম্ভবত একটি লুপ ব্যবহার করতাম, চতুর লিনকিউ সংস্করণ থাকা সত্ত্বেও, একটি লুপের অর্থ আপনাকে প্রতিটি উপাদানকে নিয়ে পুনরাবৃত্তি করতে হবে না ( এন দ্বারা সূচক বৃদ্ধি করুন)
এমকিপিপি

আমি পুরানো স্কুল সমাধানের দিকে যেতে সম্মত, এবং আমি আরও ভাল পারফরম্যান্স অনুমান করছি।
জেস্পার ফাইহর নডসন

অভিনব নতুন সিনট্যাক্সের সাথে চালিত হওয়া সহজ। যদিও এটি মজা।
রনি

34

মত শোনাচ্ছে

IEnumerator<T> GetNth<T>(List<T> list, int n) {
  for (int i=0; i<list.Count; i+=n)
    yield return list[i]
}

কৌতুক করবে। আমি লিনক বা ল্যাম্বডা এক্সপ্রেশন ব্যবহার করার প্রয়োজন দেখছি না।

সম্পাদনা করুন:

বানাও

public static class MyListExtensions {
  public static IEnumerable<T> GetNth<T>(this List<T> list, int n) {
    for (int i=0; i<list.Count; i+=n)
      yield return list[i];
  }
}

এবং আপনি একটি লিনকিশ পদ্ধতিতে লিখবেন

from var element in MyList.GetNth(10) select element;

২ য় সম্পাদনা :

এটিকে আরও লিনকিউশ করতে

from var i in Range(0, ((myList.Length-1)/n)+1) select list[n*i];

2
আমি যেখানে () পদ্ধতির পরিবর্তে এই [] গিটারটি ব্যবহার করার জন্য এই পদ্ধতিটি পছন্দ করি যা মূলত আইনামিউরেবলের প্রতিটি উপাদানকে পুনরাবৃত্তি করে। আপনার যদি আইলিস্ট / আইকোলিকেশন টাইপ থাকে তবে এটিই আরও ভাল পদ্ধতি, আইএমএইচও।
স্পোলসন

কীভাবে তালিকা কাজ করে তা নিশ্চিত নয় তবে আপনি কেন একটি লুপ ব্যবহার করেন এবং list[i]পরিবর্তে ফিরে আসেন list[n-1]কেন?
হুয়ান কার্লোস ওরোপেজা

@ জুয়ান কার্লোস অরোপেজা তিনি তালিকার নবম উপাদানটি নয়, প্রতিটি নবম উপাদানকে (যেমন 0, 3, 6 ...) ফিরিয়ে দেন।
alfoks

27

আপনি যেখানে ওভারলোড ব্যবহার করতে পারেন যা উপাদানটির সাথে সূচকটি পাস করে

var everyFourth = list.Where((x,i) => i % 4 == 0);

1
বলতে চাই আমি এই পদ্ধতির একজন ভক্ত।
কুইন্টিন রবিনসন

1
আমি ভুলে যাচ্ছি আপনি এটি করতে পারেন - খুব দুর্দান্ত।
স্টিফেন নিউম্যান

10

লুপের জন্য

for(int i = 0; i < list.Count; i += n)
    //Nth Item..

গণনা গণনা করা মূল্যায়ন করবে। যদি এটি একটি লিংক বান্ধব উপায়ে করা হয়ে থাকে তবে আপনি অলসভাবে প্রমাণ করতে পারেন এবং প্রথম 100 মান যেমন `` উত্স গ্রহণ করুন ake গ্রহণ করুন (প্রতিটি গ্রহণ করুন) (গ্রহণ করুন) ake উপাদানটি মূল্যায়ন করতে হবে
RhysC

1
@ রাইসিসি সাধারণভাবে গণনার জন্য ভাল পয়েন্ট point OTOH, প্রশ্ন নির্দিষ্ট করে List<T>, তাই Countসস্তা হিসাবে সংজ্ঞায়িত করা হয়।
টুলমেকারস্টেভ

3

আমি লিনকিউ এক্সপ্রেশন দিয়ে কাজ করা সম্ভব কিনা তা নিশ্চিত নই তবে আমি জানি যে এটি করার জন্য আপনি Whereএক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন । উদাহরণস্বরূপ প্রতি পঞ্চম আইটেম পেতে:

List<T> list = originalList.Where((t,i) => (i % 5) == 0).ToList();

এটি সেখান থেকে প্রথম আইটেম এবং প্রতি পঞ্চমটি পাবে। আপনি যদি প্রথমটির পরিবর্তে পঞ্চম আইটেমটি শুরু করতে চান তবে 0 এর সাথে তুলনা করার পরিবর্তে আপনি 4 এর সাথে তুলনা করুন।


3

আমি মনে করি আপনি যদি একটি লিনাক এক্সটেনশান সরবরাহ করেন তবে আপনার অন্তত নির্দিষ্ট ইন্টারফেসে অপারেট করতে সক্ষম হবেন, সুতরাং আইএনউমারেবল। অবশ্যই, আপনি যদি বিশেষত বড় এন এর জন্য গতি অর্জন করেন তবে আপনি সূচকযুক্ত অ্যাক্সেসের জন্য একটি ওভারলোড সরবরাহ করতে পারেন। পরেরটি বৃহত পরিমাণে প্রয়োজনীয় ডেটার উপরে পুনরাবৃত্তির প্রয়োজনীয়তা সরিয়ে দেয় এবং হিয়ার ক্লজের চেয়ে অনেক দ্রুত হবে। উভয় ওভারলোড সরবরাহের ফলে সংকলকটি সবচেয়ে উপযুক্ত বৈকল্পিক নির্বাচন করতে দেয়।

public static class LinqExtensions
{
    public static IEnumerable<T> GetNth<T>(this IEnumerable<T> list, int n)
    {
        if (n < 0)
            throw new ArgumentOutOfRangeException("n");
        if (n > 0)
        {
            int c = 0;
            foreach (var e in list)
            {
                if (c % n == 0)
                    yield return e;
                c++;
            }
        }
    }
    public static IEnumerable<T> GetNth<T>(this IList<T> list, int n)
    {
        if (n < 0)
            throw new ArgumentOutOfRangeException("n");
        if (n > 0)
            for (int c = 0; c < list.Count; c += n)
                yield return list[c];
    }
}

এটি কোনও তালিকার পক্ষে কাজ করে? কারণ আমি একটি কাস্টম শ্রেণীর জন্য একটি তালিকায় ব্যবহার করার চেষ্টা করেছি এবং <ক্লাসের পরিবর্তে আইইনামার্টেড <ক্লাস> ফিরিয়ে দিই এবং জোর করে কাভারশন (শ্রেণি) তালিকা.গেটনথ (1) কাজ করে না।
হুয়ান কার্লোস ওরোপেজা

আমার দোষটি ছিল আমাকে getNth (1) অন্তর্ভুক্ত করতে হবে irst প্রথমবারডাফল্ট ();
হুয়ান কার্লোস ওরোপেজা

0
private static readonly string[] sequence = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15".Split(',');

static void Main(string[] args)
{
    var every4thElement = sequence
      .Where((p, index) => index % 4 == 0);

    foreach (string p in every4thElement)
    {
        Console.WriteLine("{0}", p);
    }

    Console.ReadKey();
}

আউটপুট

এখানে চিত্র বর্ণনা লিখুন


0

ইমো কোন উত্তর সঠিক না। সমস্ত সমাধান 0 থেকে শুরু হয় তবে আমি আসল নবম উপাদানটি রাখতে চাই

public static IEnumerable<T> GetNth<T>(this IList<T> list, int n)
{
    for (int i = n - 1; i < list.Count; i += n)
        yield return list[i];
}

0

@ বেলুচা আমার এটি পছন্দ, কারণ ক্লায়েন্ট কোডটি খুব পঠনযোগ্য এবং সংকলকটি সবচেয়ে কার্যকর বাস্তবায়ন বেছে নেয়। আমি IReadOnlyList<T>উচ্চ পারফরম্যান্স লিনকিউর জন্য বিভাগটি প্রয়োজনীয়তাগুলি হ্রাস করে এবং সংরক্ষণ করে এটি তৈরি করব:

    public static IEnumerable<T> GetNth<T>(this IEnumerable<T> list, int n) {
        if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), n, null);
        int i = n;
        foreach (var e in list) {
            if (++i < n) { //save Division
                continue;
            }
            i = 0;
            yield return e;
        }
    }

    public static IEnumerable<T> GetNth<T>(this IReadOnlyList<T> list, int n
        , int offset = 0) { //use IReadOnlyList<T>
        if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), n, null);
        for (var i = offset; i < list.Count; i += n) {
            yield return list[i];
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.