List yourCars =

    new List{"BMW", "Saab", "Aztec" };

  var carDiff =

    (from c in myCars select c)

    .Except(from c2 in yourCars select c2);

  Console.WriteLine("Here is what you don't have, but I do:");

  foreach (string s in carDiff)

  {

    Console.WriteLine(s); // Выводит Yugo.

  }

}

Метод Intersect() возвращает результирующий набор, который содержит общие элементы данных в наборе контейнеров. Например, следующий метод возвращает последовательность из Aztec и BMW:

static void DisplayIntersection()

{

  List myCars = new List { "Yugo", "Aztec", "BMW" };

  List yourCars = new List { "BMW", "Saab", "Aztec" };

  // Получить общие члены.

  var carIntersect =

    (from c in myCars select c)

    .Intersect(from c2 in yourCars select c2);

  Console.WriteLine("Here is what we have in common:");

  foreach (string s in carIntersect)

  {

    Console.WriteLine(s); // Выводит Aztec и BMW.

  }

}

Метод Union() возвращает результирующий набор, который включает все члены множества запросов LINQ. Подобно любому объединению, даже если общий член встречается более одного раза, повторяющихся значений в результирующем наборе не будет. Следовательно, показанный ниже метод выведет на консоль значения Yugo, Aztec, BMW и Saab:

static void DisplayUnion()

{

  List myCars =

    new List { "Yugo", "Aztec", "BMW" };

  List yourCars =

    new List { "BMW", "Saab", "Aztec" };

  //  Получить объединение двух контейнеров.

  var carUnion =

    (from c in myCars select c)

    .Union(from c2 in yourCars select c2);

  Console.WriteLine("Here is everything:");

  foreach (string s in carUnion)

  {

    Console.WriteLine(s); // Выводит все общие члены.

  }

}

Наконец, расширяющий метод Concat() возвращает результирующий набор, который является прямой конкатенацией результирующих наборов LINQ. Например, следующий метод выводит на консоль результаты Yugo, Aztec, BMW, Saab и Aztec:

static void DisplayConcat()

{

  List myCars =

    new List { "Yugo", "Aztec", "BMW" };

  List yourCars =

    new List { "BMW", "Saab", "Aztec" };

  var carConcat =

    (from c in myCars select c)

    .Concat(from c2 in yourCars select c2);

  // Выводит Yugo Aztec BMW BMW Saab Aztec.

  foreach (string s in carConcat)

  {

    Console.WriteLine(s);

  }

}

<p id="AutBody_Root509">Устранение дубликатов</p>

При вызове расширяющего метода Concat() в результате очень легко получить избыточные элементы, и зачастую это может быть именно тем, что нужно. Однако в других случаях может понадобиться удалить дублированные элементы данных. Для этого необходимо просто вызвать расширяющий метод Distinct():

static void DisplayConcatNoDups()

{

  List myCars =

    new List { "Yugo", "Aztec", "BMW" };

  List yourCars =

    new List { "BMW", "Saab", "Aztec" };

  var carConcat =

    (from c in myCars select c)

    .Concat(from c2 in yourCars select c2);

  // Выводит Yugo Aztec BMW Saab.

  foreach (string s in carConcat.Distinct())

  {

    Console.WriteLine(s);

  }

}

<p id="AutBody_Root510">Операции агрегирования LINQ</p>

Запросы LINQ могут также проектироваться для выполнения над результирующим набором разнообразных операций агрегирования. Одним из примеров может служить расширяющий метод Count(). Другие возможности включают получение среднего, максимального, минимального или суммы значений с использованием членов Average(), Мах(), Min() либо Sum() класса Enumerable. Вот простой пример:

Here is a simple example:static void AggregateOps()

{

Перейти на страницу:

Похожие книги