किसी सरणी में मान का सूचकांक खोजें


113

क्या किसी सरणी में मूल्य के सूचकांक को खोजने के लिए किसी तरह linq का उपयोग किया जा सकता है?

उदाहरण के लिए, यह लूप एक सरणी के भीतर प्रमुख सूचकांक का पता लगाता है।

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;
}

और आप LINQ का भी उपयोग कर सकते हैं:

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

2
भी है एक सूची (टी) .FindIndex विधि
टीडीसी

@ पाओलो एक सूची के बारे में कैसे कहा जाता है जो लैम्ब्डा से उत्पन्न होता है? मुझे विधेय त्रुटि मिलती है।
मिहिर पटेल

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

3
+1 लेकिन, क्या होगा यदि आइटम मौजूद नहीं है? हमें 0 मिलेगा, लेकिन इंडेक्स -1 है
आर्सेन मकर्त्चयन

@ArsenMkrtchyan यदि आइटम मौजूद नहीं है, तो यह शब्द देता है। गति
जिम

@ArsenMkrtchyan आपने लिखा "हमें 0 मिलेगा" ... यह गलत था। आपने लिखा है "लेकिन सूचकांक -1 है" ... वह भी गलत है। -1 विफलता का एक सामान्य संकेतक है, लेकिन यह एकमात्र संभव नहीं है। कोई भी मान जो 0..words के भीतर नहीं है।
जिम बेल्टर

1
@JimBalter, मेरा मतलब है कि अगर आइटम मौजूद नहीं है तो अभिव्यक्ति 0 वापस आ जाएगी, इसमें गलत क्या है? मैं मानता हूं कि -1 सामान्य संकेतक है, लेकिन सहमत हूं कि यह स्पष्ट है कि आइटम नहीं होने पर 99% मामलों -1 का अपेक्षित मूल्य है। जब आइटम मौजूद नहीं है तो कम से कम 0 गलत है
आर्सेन मकर्चयन

7

यदि आप उस शब्द को ढूंढना चाहते हैं जिसका आप उपयोग कर सकते हैं

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

यह आपको पहला आइटम प्रदान करता है जिसके लिए IsKey सच है (यदि कोई गैर हो सकता है जिसे आप उपयोग करना चाहते हैं .FirstOrDefault()

आइटम और इंडेक्स दोनों का उपयोग करने के लिए

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

लिनक पागल है। मुझे लगा कि जावा जेनरिक पागल थे। वैसे भी, सभी की मदद के लिए धन्यवाद।
शुरुआती हवाई यात्रा

क्या वापसी मूल्य को स्वीकार करना अभ्यास है या शब्द के प्रकार को परिभाषित करने का एक तरीका है?
प्रारंभिकZero

ठीक है, मैं इसे लेकर आया हूं। DecodedMessageWord keyWord = words.here (x => x.IsKey == true) .First <DecodedMessageWord> ();
प्रारंभिकZero

5
@initialZero के लिए अतिभार की जाँच करें First, यह एक विधेय लेता है, आपको इसकी आवश्यकता नहीं है Where
यूरी फकटोरोविच

3

इसे इस्तेमाल करे...

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

2
यह ग्रिज़ली और मेसेन्केब्लास्ट के उत्तरों की तुलना में बहुत कमजोर समाधान की तरह लगता है। masenkablast मूल प्रश्न का उत्तर देता है और ग्रिज़ली शब्द को खोजने के लिए एक बेहतर समाधान देता है, क्योंकि उसका अंतिम "var" वास्तविक शब्द होगा न कि IEnumerable <TSource> जिसमें 1 शब्द है।
जेम्स

2

बस IndexWhere () विस्तार विधि (इकाई परीक्षणों के साथ) के मेरे कार्यान्वयन को पोस्ट किया है:

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

उदाहरण का उपयोग:

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

मैं उस लाइब्रेरी का उपयोग नहीं करूंगा, यह उन तरीकों को सही तरीके से लागू नहीं करता है। यह निपटान की अनदेखी करता है।
यूरी फकटोरोविच

1

इस समाधान ने मुझे msdn Microsoft से अधिक मदद की :

var result =  query.AsEnumerable().Select((x, index) =>
              new { index,x.Id,x.FirstName});

queryआपकी toList()क्वेरी है


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.