2009-12-08 12 views
8

में किसी तत्व की स्थिति का निर्धारण करें मेरे पास एक IQueryable है जिसे कुछ शर्त द्वारा आदेश दिया गया है। अब मैं उस IQueryable में किसी विशेष तत्व की स्थिति जानना चाहता हूं। क्या यह प्राप्त करने के लिए एक linq अभिव्यक्ति है। कहते हैं, उदाहरण के लिए वहाँ IQueryable में 10 तत्वों मैं संख्या प्राप्त करना चाहते हैं और 6 तत्व एक शर्त से मेल खाता है, 6.एक IQueryable

+1

क्या 6 वां तत्व मिलान होने पर आप नंबर 5 प्राप्त नहीं करना चाहते हैं? आम तौर पर पहले तत्व में इंडेक्स 0 होता है, दूसरे में इंडेक्स 1 होता है, आदि –

+0

हां जो मैं चाहता था और नीचे दिया गया जवाब ठीक काम करता है – San

उत्तर

13

सबसे पहले अपने सूचकांक के साथ एक आइटम चुनें, फिर आइटम फिल्टर, और अंत में मूल सूचकांक निकालें:

var result = orderedList 
    .Select((x, i) => new { Item = x, Index = i }) 
    .Where(itemWithIndex => itemWithIndex.Item.StartsWith("g")) 
    .FirstOrDefault(); 

int index= -1; 
if (result != null) 
    index = result.Index; 

टेस्ट बिस्तर:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var orderedList = new List<string> 
     { 
      "foo", "bar", "baz", "qux", "quux", 
      "corge", "grault", "garply", "waldo", 
      "fred", "plugh", "xyzzy", "thud" 
     }.OrderBy(x => x); 

     // bar, baz, corge, foo, fred, garply, grault, 
     // plugh, quux, qux, thud, waldo, xyzzy 
     // Find the index of the first element beginning with 'g'. 

     var result = orderedList 
      .Select((x, i) => new { Item = x, Index = i }) 
      .Where(itemWithIndex => itemWithIndex.Item.StartsWith("g")) 
      .FirstOrDefault(); 

     int index= -1; 
     if (result != null) 
      index = result.Index; 

     Console.WriteLine("Index: " + index); 
    } 
} 

आउटपुट:

Index: 5 
+0

+ 1- मैंने इसे अपने उत्तर में ठीक उसी तरह किया। – RichardOD

+0

क्या यह समाधान सभी ऑपरेशन के लिए SQL उत्पन्न करता है या यह IQueryable के सभी आइटम का चयन करता है और उसके बाद ही स्मृति में ऑपरेशन करता है? –

2

आप query.TakeWhile(x => !matchesCondition(x)).Count() की तरह कुछ इस्तेमाल कर सकते हैं कि हालांकि पूर्ववर्ती मूल्यों, गणना के प्रभाव पड़ता है जो हो सकता है कि आप क्या चाहते हैं।

+0

आपको उन पिछले मानों के माध्यम से गणना करना होगा, है ना? – treaschf

+0

दिलचस्प समाधान। पिछले मानों को गिनना ठीक होगा यदि यह स्मृति वस्तु थी, लेकिन डीबी के लिए नहीं। ध्यान दें कि यदि तत्व सूची में नहीं है, तो यह फ़ंक्शन सूची की लंबाई देता है। आम तौर पर आप इस तरह के कार्यों को -1 या शायद शून्य वापस करने की उम्मीद करेंगे। –

+0

@ मार्क बिअर्स: मैंने प्रश्न के वाक्यांश को पढ़ा है कि यह वांछित तत्व मौजूद था, और केवल स्थिति वांछित थी; और डीबी परिदृश्य वास्तव में गणना करने के बारे में मेरी चिंता थी। प्रैक्टिस में मुझे संदेह है कि IQueryable पर ऐसा करना मूर्खतापूर्ण है, लेकिन एक त्वरित हैक के रूप में यह दृष्टिकोण कम से कम संक्षेप में और समझ में आता है। –

0

आप "कहां" फ़ंक्शन के वर्जन का भी उपयोग कर सकते हैं जो संग्रह अनुक्रमणिका को पूर्व निर्धारित fu के पैरामीटर के रूप में शामिल करता है nction। अधिक जानकारी के लिए MSDN देखें।

var result = Enumerable.Range(0, 10).Where((x, i) => i == 6); 

यदि 6 वें तत्व नहीं है तो संस्करण की एक खाली सूची हो सकती है। इसके परिणामस्वरूप जब तक आप परिणाम पर पुनरावृत्ति नहीं करते हैं तब तक यह खंड का मूल्यांकन नहीं करता है।

संबंधित मुद्दे