Verileri bölümleme (C#)

LINQ'de bölümleme, öğeleri yeniden düzenlemeden ve sonra bölümlerden birini döndürmeden bir giriş dizisini iki bölüme bölme işlemini ifade eder.

Önemli

Bu örnekler bir System.Collections.Generic.IEnumerable<T> veri kaynağı kullanır. Veri kaynaklarını ve ifade ağaçlarını System.Linq.IQueryProviderkullanan System.Linq.IQueryable<T> veri kaynakları. İfade ağaçlarının izin verilen C# söz diziminde sınırlamaları vardır. Ayrıca EF Core gibi her IQueryProvider veri kaynağı daha fazla kısıtlama uygulayabilir. Veri kaynağınızın belgelerine bakın.

Aşağıdaki çizimde, bir dizi karakter üzerinde üç farklı bölümleme işleminin sonuçları gösterilmektedir. İlk işlem, dizideki ilk üç öğeyi döndürür. İkinci işlem ilk üç öğeyi atlar ve kalan öğeleri döndürür. Üçüncü işlem, dizideki ilk iki öğeyi atlar ve sonraki üç öğeyi döndürür.

Üç LINQ bölümleme işlemini gösteren çizim.

Dizileri bölümleyen standart sorgu işleç yöntemleri aşağıdaki bölümde listelenmiştir.

İşleçler

Yöntem adları Açıklama C# sorgu ifadesi söz dizimi Daha Fazla Bilgi
Atla Öğeleri bir dizide belirtilen konuma kadar atlar. Uygulanamaz. Enumerable.Skip
Queryable.Skip
Skipwhile Bir öğe koşulu karşılamayana kadar koşul işlevini temel alan öğeleri atlar. Uygulanamaz. Enumerable.SkipWhile
Queryable.SkipWhile
Take Öğeleri bir dizide belirtilen konuma kadar alır. Uygulanamaz. Enumerable.Take
Queryable.Take
Takewhile Bir öğe koşulu karşılamayana kadar koşul işlevini temel alan öğeleri alır. Uygulanamaz. Enumerable.TakeWhile
Queryable.TakeWhile
Öbek Bir dizinin öğelerini belirtilen en büyük boyuttaki öbeklere böler. Uygulanamaz. Enumerable.Chunk
Queryable.Chunk

Aşağıdaki örneklerin tümü, 0 ile 7 arasında bir sayı dizisi oluşturmak için kullanılır Enumerable.Range(Int32, Int32) .

Bir dizideki Take yalnızca ilk öğeleri almak için yöntemini kullanırsınız:

foreach (int number in Enumerable.Range(0, 8).Take(3))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 0
// 1
// 2

Bir dizideki Skip ilk öğeleri atlamak için yöntemini ve kalan öğeleri kullanırsınız:

foreach (int number in Enumerable.Range(0, 8).Skip(3))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 3
// 4
// 5
// 6
// 7

TakeWhile ve SkipWhile yöntemleri de bir dizideki öğeleri alır ve atlar. Ancak, bu yöntemler belirli sayıda öğe yerine bir koşula göre öğeleri atlar veya alır. TakeWhile bir öğe koşulla eşleşmeyene kadar bir dizinin öğelerini alır.

foreach (int number in Enumerable.Range(0, 8).TakeWhile(n => n < 5))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 0
// 1
// 2
// 3
// 4

SkipWhile koşul true olduğu sürece ilk öğeleri atlar. Koşulla eşleşmeyen ilk öğe ve sonraki tüm öğeler döndürülür.

foreach (int number in Enumerable.Range(0, 8).SkipWhile(n => n < 5))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 5
// 6
// 7

Chunk işleci, belirli sizebir temelinde bir dizinin öğelerini bölmek için kullanılır.

int chunkNumber = 1;
foreach (int[] chunk in Enumerable.Range(0, 8).Chunk(3))
{
    Console.WriteLine($"Chunk {chunkNumber++}:");
    foreach (int item in chunk)
    {
        Console.WriteLine($"    {item}");
    }

    Console.WriteLine();
}
// This code produces the following output:
// Chunk 1:
//    0
//    1
//    2
//
//Chunk 2:
//    3
//    4
//    5
//
//Chunk 3:
//    6
//    7

Yukarıdaki C# kodu:

  • Bir sayı dizisi oluşturmaya dayanır Enumerable.Range(Int32, Int32) .
  • İşleci uygular Chunk ve sırayı en büyük boyutu üç olan öbeklere böler.

Ayrıca bkz.