Главная » C# » Операции над множествами LINQ в Visual C# (Sharp)

0

Последний основной аспект, который нужно знать при работе с LINQ, — это волнение операций над множествами с набором данных. Но большим недостатком выполнения операций над множествами является необходимость использования методов; на момент написания данной книги LINQ не предоставлял поддержки для таких операций.

Знать  об  операциях  над  множествами  полезно,  т. к.  они  позволяют  сортировать и организовывать несколько результирующих наборов данных. В примерах в этом разделе снова применяется тип customer. Но чтобы операции над множествами работали должным образом, необходимо реализовать методы Equals () и GetHashCode (), как показано в следующем коде:

class Customer {

public string Identifier; public int Points;

public override string ToStringO {

return "Identifier (" + Identifier + ") Points (" + Points + ")";

}

public override bool Equals(object obj) { if (obj is Customer) {

Customer otherObj = obj as Customer; if (otherObj.Points == Points &&

otherObj.Identifier.CompareTo(Identifier) == 0) { return true;

}

}

return false;

}

public override int GetHashCode() {

return Points * Identifier.GetHashCode();

}

}

ПРИМЕЧАНИЕ

Здесь дается лишь элементарная реализация метода GetHashCode ().  В  исходном коде находится библиотека класса GetHashCode, которая упрощает задачу реализии метода GetHashCode (). Данный исходный код находится в проекте ServerSideSpreadsheet\Devspace.Trader.Common\Automators.

Реализация методов Equals () и GetHashCode () для пользовательских типов являея обязательной, т. к. операции над множествами используют эту информацию для определения идентичности объектов. Если не реализовать любой из этих методов, то операции над множествами будут использовать стандартные реализации  метов Equals о и GetHashCode (), которые не являются достаточными, и дадут вам неправильные результаты.

Следующим шагом будет создание двух отдельных списков клиентов. В данном примере оба списка содержат одного  и того же ценного заказчика. Следует иметь в виду, что этот одинаковый клиент не является одним и тем же экземпляром обкта, но содержит одинаковые значения.

List<Customer> customersl = new List<Customer>() { new Customer { Identifier =  "Person 1",

Points = 0 },

new Customer { Identifier = "Person 2",

Points = 10 }

} ;

List<Customer> customers2 = new List<Customer>() { new Customer { Identifier = "Person 3",

Points = 20 },

new Customer { Identifier = "Person 2",

Points = 10 }

} ;

Жирным  шрифтом  выделен клиент, содержащийся  в обоих списках.  Но что, если бы списки были подобны следующим:

List<Customer> customersl = new List<Customer>() { new Customer { Identifier = "Person 1",

Points = 0 },

new Customer { Identifier = "Person 2",

Points = 10 }

} ;

List<Customer> customers2 = new List<Customer>() { new Customer { Identifier = "Person 3",

Points = 20 },

new Customer { Identifier = "Person 2",

Points = 20 }

} ;

Теперь, даже хотя  клиент Person 2 существует в двух местах, значения свойства Points разные,   что   заставляет   спросить,   не   должны   ли    методы    Equals о и GetHashCode () возвратить результат, что объекты не являются  идентичными? Ответ зависит от вашего приложения. Если код приложения говорит, что два клнта с одинаковым значением свойства identifier, но разными значениями свотва  Points являются  одним  и  тем  же  человеком,  то  тогда  методы  Equals () и GetHashCode о не должны принимать во внимание значение свойства Points. Необходимо учитывать это обстоятельство, т. к. если вы намереваетесь вызывать метод Distinct () и принимаете во внимание значение свойства Points, то у вас будут два экземпляра одного и того же клиента.

Список всех уникальных клиентов можно получить с помощью метода union ():

var uniqueCustomeirs = customersl.Union(customers2);

Список, представленный переменной uniquecustomers, будет содержать трех клнтов из двух списков.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии