Операції над множинами LINQ в Visual C # (Sharp)

Останній основний аспект, який потрібно знати при роботі з LINQ, – це хвилювання операцій над множинами з набором даних Але великим недоліком виконання операцій над множинами є необхідність використання методів на момент написання даної книги LINQ не надавав підтримки для таких операцій

Знати про операції над множинами корисно, тому що вони дозволяють сортувати і організовувати кілька результуючих наборів даних У прикладах в цьому розділі знову застосовується тип customer Але щоб операції над множинами працювали належним чином, необхідно реалізувати методи Equals () і GetHashCode (), як показано в наступному коді:

class Customer {

public string Identifier public int Points

public override string ToStringO {

return &quotIdentifier (&quot + Identifier + &quot) Points (&quot + Points + &quot)"

}

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

Customer otherObj = obj as Customer if (otherObjPoints == Points &amp&amp

otherObjIdentifierCompareTo(Identifier) == 0) { return true

}

}

return false

}

public override int GetHashCode() {

return Points * IdentifierGetHashCode()

}

}

ПРИМІТКА

Тут дається лише елементарна реалізація методу GetHashCode () У вихідному коді знаходиться бібліотека класу GetHashCode, яка спрощує завдання реалізується шляхом GetHashCode () Даний вихідний код знаходиться у проекті ServerSideSpreadsheet \ DevspaceTraderCommon \ Automators

Реалізація методів Equals () і GetHashCode () для користувача типів являея обовязковою, т к операції над множинами використовують цю інформацію для визначення ідентичності обєктів Якщо не реалізувати будь-який з цих методів, то операції над множинами будуть використовувати стандартні реалізації метов Equals про і GetHashCode (), які не є достатніми, і дадуть вам неправильні результати

Наступним кроком буде створення двох окремих списків клієнтів У даному прикладі обидва списки містять одного і того ж цінного замовника Слід мати на увазі, що цей однаковий клієнт не є одним і тим же примірником обкта, але містить однакові значення

List&ltCustomer&gt customersl = new List&ltCustomer&gt() { new Customer { Identifier =  &quotPerson 1&quot,

Points = 0 },

new Customer { Identifier = &quotPerson 2&quot,

Points = 10 }

}

List&ltCustomer&gt customers2 = new List&ltCustomer&gt() { new Customer { Identifier = &quotPerson 3&quot,

Points = 20 },

new Customer { Identifier = &quotPerson 2&quot,

Points = 10 }

}

Жирним шрифтом виділено клієнт, що міститься в обох списках Але що, якщо б списки були подібні наступним:

List&ltCustomer&gt customersl = new List&ltCustomer&gt() { new Customer { Identifier = &quotPerson 1&quot,

Points = 0 },

new Customer { Identifier = &quotPerson 2&quot,

Points = 10 }

}

List&ltCustomer&gt customers2 = new List&ltCustomer&gt() { new Customer { Identifier = &quotPerson 3&quot,

Points = 20 },

new Customer { Identifier = &quotPerson 2&quot,

Points = 20 }

}

Тепер, навіть хоча клієнт Person 2 існує в двох місцях, значення властивості Points різні, що змушує запитати, чи не повинні методи Equals про і GetHashCode () повернути результат, що обєкти не є ідентичними Відповідь залежить від вашої програми Якщо код додатку каже, що два клнта з однаковим значенням властивості identifier, але різними значеннями свотва Points є одним і тим же людиною, то тоді методи Equals () і GetHashCode про не повинні брати до уваги значення властивості Points Необхідно враховувати цю обставину, оскільки якщо ви маєте намір викликати метод Distinct () і приймаєте до уваги значення властивості Points, то у вас будуть два примірники одного і того ж клієнта

Список всіх унікальних клієнтів можна отримати за допомогою методу union ():

var uniqueCustomeirs = customerslUnion(customers2)

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

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*