একক পদক্ষেপে কোনও তালিকার কোনও আইটেমের সূচকটি কীভাবে পাবেন?


193

তালিকার কোনও আইটেমের লুপ না করে কীভাবে আমি সূচকটি পেতে পারি?

বর্তমানে এটি খুব সুন্দর দেখাচ্ছে না - একই সূচীটির জন্য দুটি বার তালিকার মাধ্যমে অনুসন্ধান করা, কেবল সূচক পেতে:

var oProp = something;

int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));

উত্তর:


434

তালিকা সম্পর্কে কীভাবে.ফাইন্ড ইন্ডেক্স পদ্ধতি :

int index = myList.FindIndex(a => a.Prop == oProp);

এই পদ্ধতিটি একটি লিনিয়ার অনুসন্ধান সম্পাদন করে; অতএব, এই পদ্ধতিটি একটি ও (এন) অপারেশন, যেখানে এন গণনা।

আইটেমটি পাওয়া না গেলে, এটি -1 ফিরে আসবে


2
কীভাবে int index?
ডিলান জেজেনস্কি

2
@ ডিলানচেনস্কি তিনি জেএসকে অনেক বেশি কোডিং করছেন
লেনি

9
রেফারেন্সের জন্য, আইটেমটি পাওয়া না গেলে; এটি -১ আসবে
ড্যানিয়েল ফিলিপ


71

সম্পাদনা: আপনি যদি কেবল একটি ব্যবহার করেন List<>এবং আপনার কেবল সূচকের প্রয়োজন হয় তবে List.FindIndexতা অবশ্যই সর্বোত্তম পন্থা। আমি এই উত্তরটি এখানে তাদের জন্য ছেড়ে দেব যাদের আলাদা কিছু প্রয়োজন (যেমন কোনওর উপরে IEnumerable<>)।

Selectযে ওভারলোডটি প্রিডিকেটে একটি সূচক নেয় সেগুলি ব্যবহার করুন , সুতরাং আপনি আপনার তালিকাটিকে (সূচক, মান) জোড়ায় রূপান্তরিত করুন:

var pair = myList.Select((Value, Index) => new { Value, Index })
                 .Single(p => p.Value.Prop == oProp);

তারপর:

Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);

অথবা যদি আপনি কেবল সূচক চান এবং আপনি এটি একাধিক স্থানে ব্যবহার করছেন তবে আপনি সহজেই নিজের এক্সটেনশন পদ্ধতিটি লিখতে পারতেন যা পছন্দ মতো ছিল Where, তবে মূল আইটেমগুলি ফেরত না দিয়ে, সেই আইটেমগুলির সূচকগুলি প্রত্যাবর্তনের সাথে মেলে।


দেখে মনে হচ্ছে তিনি যা চান তার সবটাই সূচক। তালিকা <>। FindIndex (পূর্বাভাস <>) সর্বোত্তম পন্থা। যদিও প্রশ্নের শিরোনাম অন্যথায় অন্তরঙ্গ করে তুলবে, ওপির বর্ণনটি বেশ স্পষ্ট যে তিনি কেবল "ইনট্রিক্ট ইনটিচুয়ালিঅ্যামটিস্ট্রেইটইন" ইনডেক্স প্রয়োজন
লুই রিচি

1
@ লাস্টকোডার: আহা - ফাইন্ড ইন্ডেক্সটি মিস করেছে। হ্যাঁ, আমি সম্পূর্ণ একমত
জন স্কিটি

কেবল স্পষ্ট করে বলতে গেলে, ম্যানুয়ালি দ্বিগুণ পুনরুক্তির চেয়ে "সূচক / মান -> একক" পদ্ধতির "আরও ভাল" (এখানে বিগ-ও-এর দিক দিয়ে দ্রুত হওয়া মানে)? বা লিনকুই 2 অবজেক্টার সরবরাহকারীর পুনরাবৃত্তিগুলির মধ্যে একটি অপসারণের পক্ষে যথেষ্ট স্মার্ট? (আমি এই ধারণাটি তৈরি করছি যে সিলেক্ট এবং একক উভয়ই সাধারণত কথা বলছেন ও (এন) অপারেশন)
সারা

1
@ কাই: আমি মনে করি আপনার মূলত লিনকিউ কীভাবে কাজ করে তা পড়া উচিত। একটি মন্তব্যে বিস্তারিত ব্যাখ্যা করা খুব জটিল। তবে ... এটি একবার উত্স সংগ্রহের মাধ্যমে পুনরাবৃত্তি হয়। লিনকুই একটি পাইপলাইন সেট আপ করে, যা আলস্যভাবে ইনপুট সিকোয়েন্সটিকে অন্য সিকোয়েন্সে রূপান্তরিত করে, এবং তারপরে Single()ক্রিয়াকলাপটি সেই অনুক্রমের উপরে পুনরাবৃত্তি করে এবং একক আইটেমটি খুঁজে পায় যা প্রিডিকেটের সাথে মেলে। আরও তথ্যের জন্য, আমার এডুলিনক ব্লগ সিরিজটি পড়ুন: কোডব্লগ.জোঁসকেট.ইক
জন স্কিটি

1
+1 আমার এই সমাধানটি দরকার ছিল। বস ভেবেছিল আমি একবারের জন্য স্মার্ট। আমাকে সাবধানতার সাথে এটি নথিভুক্ত করার পরামর্শ দেওয়া হয়েছিল, যেহেতু এটি একটি বেনামি প্রকার ব্যবহার করেছে এবং সম্ভবত এই অঞ্চলটির পরবর্তী কোডারের কাছে এটি পরিষ্কার নয়।
অ্যাডাম ওয়েলস

14

আপনি যদি লিনকিউ ব্যবহার করতে না চান তবে:

int index;
for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Prop == oProp)
    {
       index = i;
       break;
    }
}

এইভাবে আপনি কেবল একবার তালিকা পুনরাবৃত্তি করছেন।


22
কিংকিং নুন জানিয়েছেন
টোমর ডাব্লু

1
এটি কি লিনকের মতো একই বাস্তবায়ন FindIndexআগ্রহের বাইরে?
কোপস

2
সম্ভবত একই কোড নয়, তালিকার এখানে কিছুটা ঝরঝরে অপ্টিমাইজেশন রয়েছে। তবে আমার বিশ্বাস করা কঠিন যে তারা ও (এন) এর চেয়ে কম অর্ডারযুক্ত তালিকা অনুসন্ধান করতে পারে, তাই আমি বলব যে তারা বাস্তবে বাস্তবে একই রকম।
সার

6
  1. তালিকার যে কোনও স্ট্রিংয়ের মান সূচকের সন্ধানের সহজ সমাধান।

স্ট্রিংয়ের তালিকার কোড এখানে:

int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
  1. তালিকার কোনও পূর্ণসংখ্যার মানের সূচক খুঁজতে সহজ সমাধান।

পূর্ণসংখ্যার তালিকার জন্য কোডটি এখানে:

    int indexOfNumber = myList.IndexOf(/*insert number from list*/);

2

আইইনুমেবলের জন্য এখানে একটি অনুলিপি / পেস্ট-সক্ষম এক্সটেনশন পদ্ধতি

public static class EnumerableExtensions
{
    /// <summary>
    /// Searches for an element that matches the conditions defined by the specified predicate,
    /// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list">The list.</param>
    /// <param name="predicate">The predicate.</param>
    /// <returns>
    /// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw.
    /// </returns>
    public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate)
    {
        var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First();
        return idx;
    }
}

উপভোগ করুন।


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