2009-12-08 17 views
8

bir elemanın konumunu belirleme Bazı koşul tarafından sipariş edilen bir IQueryable var. Şimdi belirli bir öğenin IQueryable içindeki konumunu bilmek istiyorum. Bunu elde etmek için bir linq ifadesi var mı? Say örneğin ben numara almak istiyorum, orada IQueryable 10 unsurlarıdır ve 6. eleman bir koşula uyan 6.bir IQueryable

+1

Eğer 6 eleman eşleşirse numara 5 almak istemiyor musunuz? Normalde ilk unsur ikinci indeks 1, vb –

+0

evet istediğim ve aşağıdaki cevabı – San

cevap

13

İlk sonra öğelere filtre, onun indeksi her öğeyi seçin ve son olarak orijinal endeksi ayıklamak:

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; 

Testi yatak:

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

Çıktı:

Index: 5 
+0

+ 1- Cevabımda da aynısını yaptım. – RichardOD

+0

Bu çözüm, tüm işlemler için SQL üretir mi, yoksa IQueryable'ın tüm öğelerini seçer ve yalnızca bu işlem bellekteki işlemleri yaptıktan sonra mı? –

2

o önceki değerleri, sıralandıran etkisi vardır gerçi sen query.TakeWhile(x => !matchesCondition(x)).Count() gibi bir şey kullanabilirsiniz hangi istediğin şey olmayabilir.

+0

Sen zaten o önceki değerlere Numaralandırılacak getirmeniz gerekiyor, gayet iyi çalışıyor thats ne oldu, indeks 0 sahiptir? – treaschf

+0

İlginç bir çözüm. Bir bellek nesnesi olsaydı, önceki değerlerin numaralandırılması tamam olurdu, ancak bir DB için değil. Öğe listede değilse, bu işlev listenin uzunluğunu döndüreceğini unutmayın. Normalde, bu tür fonksiyonların -1 veya belki de sıfır olması beklenir. –

+0

@Mark Byers: Sorunun, istenen elemanın mevcut olduğu ve sadece pozisyonun arzu edildiğini ima ettiği ifadesini okudum; DB senaryosu gerçekten de sayım konusunda endişeliydi. Pratikte, bunu bir IQueryable'a yapmanın aksini bildiğinden şüpheliyim, fakat hızlı bir korsanlık olarak bu yaklaşım en azından özlü ve anlaşılabilir bir durumdur. –

0

Ayrıca, koleksiyon dizinini, yüklemiş fu'ye bir parametre olarak ekleyen "Nerede" işlevinin versonunu da kullanabilirsiniz. nction. Daha fazla bilgi için bkz. MSDN. Bir 6 unsur yoksa

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

versiyonu boş bir listeye neden olabilir. Ayrıca bu, sonuç üzerinde yinelemeye başlayana kadar nerede olduğunu değerlendirmez.

İlgili konular