Taking the union of two sets is useful and LINQ includes a query operator.
In the case where you want LINQ Union to return a distinct list of the union, You can implement an equality comparer (line 13) as shown below.
1: public class Contact
2: {
3: public string Name { get; set; }
4: public string Address { get; set; }
5:
6: public override string ToString()
7: {
8: return string.Format("{0} ---> {1}", Name, Address);
9: }
10:
11: }
12:
13: public class ContactComparer : IEqualityComparer
14: {
15: #region IEqualityComparer Members
16:
17: public bool Equals(Contact x, Contact y)
18: {
19: return x.Name == y.Name;
20: }
21:
22: public int GetHashCode(Contact obj)
23: {
24: return obj.Name.GetHashCode();
25: }
26:
27: #endregion
28: }
29:
30: public class MyClass
31: {
32: public static void RunSnippet()
33: {
34: var contacts1 = new List{
35: new Contact {
36: Name = "Guy",
37: Address = "Ontario"
38: },
39: new Contact {
40: Name = "Frank",
41: Address = "Manitoba"
42: },
43: new Contact {
44: Name = "Alain",
45: Address = "Manitoba"
46: }
47: };
48:
49: var contacts2 = new List{
50: new Contact {
51: Name = "Guy",
52: Address = "Ontario"
53: },
54: new Contact {
55: Name = "Marc",
56: Address = "Ontario"
57: },
58: };
59:
60: var ontariocontact1 = from c1 in contacts1
61: where c1.Address == "Ontario"
62: select c1;
63:
64: var ontariocontact2 = from c2 in contacts2
65: where c2.Address == "Ontario"
66: select c2;
67:
68: var uniqueContacts = ontariocontact1.Union(ontariocontact2,
69: new ContactComparer());
70: foreach (Contact contact in uniqueContacts)
71: {
72: Console.WriteLine(contact.ToString());
73: System.Diagnostics.Debug.WriteLine(contact.ToString());
74: }
75: }
The output from this will be:
Guy ---> Ontario Marc ---> OntarioGoogle+