2013-06-23 3 views
11

List<Person> में Name संपत्ति "कॉमट्रूज़" पर सेट की गई सूची में आइटम की अनुक्रमणिका प्राप्त करें। मुझे उस सूची में उस Person की अनुक्रमणिका की आवश्यकता है। Person नहीं, बस यह सूचकांक है।अपनी संपत्ति

string myName = ComTruise; 
int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count(); 

मैं इसे बेहतर या indexOf पद्धति का उपयोग एक ही कार्य करने के लिए क्या कर सकते हैं कैसे?

क्या मैं अब कर रहा है कर रहा हूँ

+2

कि काफी क्या indexOf करता है ... –

+0

MyList अपने खुद के संग्रह है या यह सूची है? –

+0

क्षमा करें, इसे ठीक किया गया। इंडेक्सऑफ का सिंटैक्स कैसा होगा? – Sturm

उत्तर

12

यह एक ObservableCollection है के रूप में, तुम कोशिश कर सकते इस

int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault()); 

यह -1 वापस आ जाएगी, तो "ComTruise" अपने संग्रह में मौजूद नहीं है।

जैसा कि टिप्पणियों में बताया गया है, यह दो खोज करता है। आप इसे लूप के साथ अनुकूलित कर सकते हैं।

int index = -1; 
for(int i = 0; i < MyList.Count; i++) 
{ 
    //case insensitive search 
    if(String.Equals(MyList[i].Name, "ComTruise", StringComparison.OrdinalIgnoreCase)) 
    { 
     index = i; 
     break; 
    } 
} 
+0

तो, आप इसे पहले पाते हैं और फिर इसे फिर से ढूंढते हैं? यह काफी अक्षम है। – svick

+0

आप सही हैं, अगर सूची काफी बड़ी है, तो फॉर लूप बेहतर होगा। मैंने अपना जवाब अपडेट कर लिया है। – keyboardP

+0

आपने सबस्ट्रिंग पर मिलान करने के लिए तुलना क्यों बदल दी? उदाहरण के लिए, "एक्स-कॉमट्रूज़" का नाम आपके "केस असंवेदनशील खोज" से मेल खाता है। – svick

0
var p = MyList.Where(p => p.Name == myName).FirstOrDefault(); 
int thatIndex = -1; 
if (p != null) 
{ 
    thatIndex = MyList.IndexOf(p); 
} 

if (p != -1) ... 
17

आप इस्तेमाल कर सकते हैं FindIndex

string myName = "ComTruise"; 
int myIndex = MyList.FindIndex(p => p.Name == myName); 

नोट: FindIndex रिटर्न -1 कोई शर्त आपूर्ति विधेय द्वारा परिभाषित मिलान आइटम सूची में पाया जा सकता है।

+0

Arg, वास्तव में यह एक अवलोकन करने योग्य चयन है और सूची नहीं है, क्या कुछ समकक्ष है? मैंने सोचा कि यह इस विशेष मामले में समान था। – Sturm

+0

यह बहुत अच्छा काम करता है अगर मैं अपने ऑब्जर्जेबल कोलेक्शन को सूची में परिवर्तित करता हूं। टोस्टिस्ट() विधि। धन्यवाद! – Sturm

+0

क्रैकिंग, जो निश्चित रूप से आपको सॉर्ट करेगा, लेकिन आप बिना रूपांतरण के इसे भी कर सकते हैं (कुछ अन्य उत्तरों पहले ही दिखाए गए हैं कि कैसे = डी)। – Chris

6

यह मतलब हो सकता है एक सरल विस्तार विधि है कि यह करता है लिखने के लिए:

public static int FindIndex<T>(
    this IEnumerable<T> collection, Func<T, bool> predicate) 
{ 
    int i = 0; 
    foreach (var item in collection) 
    { 
     if (predicate(item)) 
      return i; 
     i++; 
    } 
    return -1; 
} 
संबंधित मुद्दे