2009-06-25 11 views
50

kullanarak Listesinden bir sağlanan endeks aralığında değerleri seçmek için:aşağıdaki modernleşmek için ben kullanmaya çalışınca bir LINQ newbie LINQ

Ben ints bir listesi var: -

List<int> intList = new List<int>(new int[]{1,2,3,3,2,1}); 

Şimdi, LINQ kullanarak ilk üç öğenin [indeks aralığı 0-2] son ​​üç [indeks aralığı 3-5] ile karşılaştırmak istiyorum. LINQ Select çalıştı ve uzatma yöntemleri yanı sıra SelectMany yöntemini al, fakat benim de uzatma yöntemini içerir baktı şey

(from p in intList 
where p in Take contiguous elements of intList from index x to x+n 
select p).sum() 

gibi nasıl söyleyeceğimi bilemiyorum, ama bu almak görmüyor ben ne istersem Baska öneri? Teşekkürler.

cevap

77

Skip kullanın.

yourEnumerable.Skip(4).Take(3).Select(x=>x) 

(from p in intList.Skip(x).Take(n) select p).sum() 
+6

Not olabilir. wordpress.com/2012/08/27/performance-of-skip-and-take-in-linq-to-objects/, http://geekswithblogs.net/BlackRabbitCoder/archive/2012/03/29/c.net -little-wonders-skip-and-take.aspx – nawfal

+0

Bu, iyi, geçerli bir yorumdur (bu yüzden bir kaç yıl önce aynı şeyi söyleyen cevap yazarımı yedim o kadar geçerliydi), özellikle de LINQ hakkında sordu. yapamazsın y kaynağınız olarak bir List garanti eder. Bu, söz konusu gerçek sorunun basitleştirilmiş bir versiyonu olabilir, basitleştirilmiş versiyon sadece kodlanmış bir Liste (ve gerçekten bir nesne grafiğinde veya SQL sorgusunda bir LINQ üzerinde bir sorgu olabilir). –

15

büyük listeleri için, ayrı bir uzantısı yöntemi performans için daha uygun olabilir. Bunun ilk durum için gerekli olmadığını biliyorum, ancak Linq (nesneler) uygulaması listeyi tekrarlamaya dayanıyor, bu yüzden büyük listeler için bu (pahalı) pahalı olabilir. Basit bir uzantısı yöntem bu olabilir ulaşmak için: https: // icodeit

public static IEnumerable<TSource> IndexRange<TSource>(
    this IList<TSource> source, 
    int fromIndex, 
    int toIndex) 
{ 
    int currIndex = fromIndex; 
    while (currIndex <= toIndex) 
    { 
     yield return source[currIndex]; 
     currIndex++; 
    } 
} 
+0

Teşekkürler, benim günümü yaptın! –

26

O Liste .GetRange büyük koleksiyonları için olsa daha verimli olacaktır() GetRange kullanmak

list.GetRange(index, count); 
+1

Bu işlev nerede? .NET 4.5 ya da bir şey? –

+4

@AdamNofsinger Bu, System.Collections.Generic ad alanı altındadır. Net 2.0 ile geldi. http://msdn.microsoft.com/en-us/library/21k0e39c(v=vs.80).aspx – Onuralp