একটি অ্যারের মধ্যে একটি মান সূচক সন্ধান করুন


113

অ্যারের মধ্যে কোনও মানের সূচকটি খুঁজে পেতে লিনাককে কীভাবে ব্যবহার করা যেতে পারে?

উদাহরণস্বরূপ, এই লুপটি একটি অ্যারের মধ্যে কী সূচকটি সনাক্ত করে।

for (int i = 0; i < words.Length; i++)
{
    if (words[i].IsKey)
    {
        keyIndex = i;
    }
}

আসলে, কেবল শব্দটি পাওয়া ভালই হবে।
প্রাথমিক জিরো

উত্তর:


183
int keyIndex = Array.FindIndex(words, w => w.IsKey);

এটি আপনি কাস্টম ক্লাসটি তৈরি করেছেন তা বিবেচনা না করেই এটি আপনাকে পূর্ণসংখ্যার সূচকটি দেয় এবং অবজেক্টটি নয়


1
কেন এটি System.Linqডিফল্টরূপে কোনও এক্সটেনশন পদ্ধতিতে তৈরি করা হয়নি ? এই যে এখানে অন্য সব কিছুর!
qJake

63

অ্যারেগুলির জন্য আপনি ব্যবহার করতে পারেন Array.FindIndex<T>:

int keyIndex = Array.FindIndex(words, w => w.IsKey);

তালিকার জন্য আপনি ব্যবহার করতে পারেন List<T>.FindIndex:

int keyIndex = words.FindIndex(w => w.IsKey);

আপনি জেনেরিক এক্সটেনশন পদ্ধতিও লিখতে পারেন যা কোনওর জন্য কার্যকর হয় Enumerable<T>:

///<summary>Finds the index of the first item matching an expression in an enumerable.</summary>
///<param name="items">The enumerable to search.</param>
///<param name="predicate">The expression to test the items against.</param>
///<returns>The index of the first matching item, or -1 if no items match.</returns>
public static int FindIndex<T>(this IEnumerable<T> items, Func<T, bool> predicate) {
    if (items == null) throw new ArgumentNullException("items");
    if (predicate == null) throw new ArgumentNullException("predicate");

    int retVal = 0;
    foreach (var item in items) {
        if (predicate(item)) return retVal;
        retVal++;
    }
    return -1;
}

এবং আপনি লিনকিউটিও ব্যবহার করতে পারেন:

int keyIndex = words
    .Select((v, i) => new {Word = v, Index = i})
    .FirstOrDefault(x => x.Word.IsKey)?.Index ?? -1;


@ পাওলো কীভাবে লাম্বদা থেকে উত্পন্ন একটি তালিকা সম্পর্কে? আমি শিকারী ত্রুটি পেয়েছি।
মিহির প্যাটেল

10
int keyIndex = words.TakeWhile(w => !w.IsKey).Count();

3
+1 তবে, আইটেমটি না থাকলে কী হবে? আমরা 0 পাব, তবে সূচকটি হ'ল
আর্সেন এমক্র্টচায়ান

@ আর্সেনমর্কটিচিয়ান যদি এই আইটেমটি না থাকে তবে এটির জন্য শব্দটি আসে en দৈর্ঘ্য
জিম

@ আর্সেনমর্কটচায়ান আপনি লিখেছেন "আমরা 0 পাব" ... ভুল ছিল। আপনি লিখেছেন "তবে সূচকটি -1" ... এটিও ভুল। -1 ব্যর্থতার একটি সাধারণ সূচক, তবে এটি কেবলমাত্র একমাত্র সম্ভাব্য নয়। যে কোনও মান 0.Words.Length-1 এর মধ্যে নেই।
জিম বাল্টার

1
@ জিমবাল্টার, আমি বলতে চাইছি যদি আইটেমটি না থাকে তবে অভিব্যক্তি 0 ফিরে আসবে, এতে কী ভুল? আমি সম্মত হই যে -1 সাধারণ সূচক, তবে সম্মত হন যে আইটেমটি উপস্থিত না থাকলে 99% কেস -1 প্রত্যাশিত মান প্রত্যাশিত। আইটেমটি উপস্থিত না থাকলে কমপক্ষে 0 টি ভুল হয়
আর্সেন এমক্রটিচিয়ান

7

আপনি যদি শব্দটি ব্যবহার করতে চান তবে ব্যবহার করতে পারেন

var word = words.Where(item => item.IsKey).First();

এটি আপনাকে প্রথম আইটেম দেয় যার জন্য ইসকি সত্য (যদি এটি নাও থাকে তবে আপনি ব্যবহার করতে চাইতে পারেন .FirstOrDefault()

আইটেম এবং সূচি উভয়ই পেতে আপনি ব্যবহার করতে পারেন

KeyValuePair<WordType, int> word = words.Select((item, index) => new KeyValuePair<WordType, int>(item, index)).Where(item => item.Key.IsKey).First();

লিনাক পাগল। আমি ভেবেছিলাম জাভা জেনেরিকস পাগল। যাইহোক, সমস্ত সাহায্যের জন্য ধন্যবাদ।
প্রাথমিক জিরো

রিটার্ন মান গ্রহণযোগ্য অনুশীলন কাস্টিং বা শব্দের ধরণ সংজ্ঞায়নের কোনও উপায় আছে?
প্রাথমিক জিরো

ঠিক আছে, আমি এই নিয়ে এসেছি। ডিকোডডমেসেজ ওয়ার্ড কীওয়ার্ড = শব্দসমূহ here যেখানে (x => x.IsKey == সত্য) irst
প্রাথমিক জিরো

5
@initialZero জন্য overloads খুঁজে বার করো First, এটা একটা সম্পৃক্ত লাগে, আপনি প্রয়োজন নেই Where
ইউরি ফক্টোরিভিচ

3

এটা চেষ্টা কর...

var key = words.Where(x => x.IsKey == true);

2
গ্রিজলি এবং ম্যাসেনকাব্লাস্টের উত্তরগুলির তুলনায় এটি একটি খুব দুর্বল সমাধান বলে মনে হচ্ছে। ম্যাসেনকাব্লাস্ট মূল প্রশ্নের উত্তর দেয় এবং গ্রিজলি শব্দটি সন্ধানের জন্য আরও ভাল সমাধান দেয় কারণ তার চূড়ান্ত "ভার "টি আসল শব্দ হবে এবং একটি শব্দযুক্ত নয় << উত্স> যা 1 শব্দ রয়েছে।
জেমস

2

সবেমাত্র আমার সূচক (যেখানে ইউনিট টেস্ট সহ) এক্সটেনশন পদ্ধতির বাস্তবায়ন পোস্ট করেছে:

http://snipplr.com/view/53625/linq-index-of-item--indexwhere/

ব্যবহারের উদাহরণ:

int index = myList.IndexWhere(item => item.Something == someOtherThing);

আমি সেই লাইব্রেরিটি ব্যবহার করব না, এটি সেই পদ্ধতিগুলি সঠিকভাবে প্রয়োগ করে না। এটি নিষ্পত্তি উপেক্ষা করে।
ইউরি ফক্টোরিভিচ


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