List Set

List로 중복 리스트 제거, 차집합, 교집합, 합집합을 구현해 보자.

여기에서 사용된 using은 다음과 같다.

using System;
using System.Collections.Generic;
using System.Linq;

1. 1부터 10까지 출력하기
            //int[] squares = Enumerable.Range(1, 10).ToArray<int>();
            //var squares = Enumerable.Range(1, 10).ToArray();
            IEnumerable<int> squares = from value in Enumerable.Range(1, 10) select value;
            
            foreach (int num in squares)
            {
                Console.Write("{0} ", num);
            }

출력 :   1 2 3 4 5 6 7 8 9 10

2. IEnumerable 사용
        public void Test()
        {
            Display(new List<bool> { true, false, true});
        }

        static void Display(IEnumerable<bool> argument)
        {
            foreach (bool value in argument)
            {
                Console.Write("{0} ", value);
            }
        }

출력:  True False True

3. 중복 리스트 제거
            List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };
            //distinctList = yourList.Distinct().ToList();
            List<int> distinctList = Enumerable.ToList(Enumerable.Distinct(ages));

            foreach (int age in distinctList)
            {
                Console.Write("{0} ", age);
            }

출력: 21 46 55 17

List.Distinct 유니티 C#에서 지원하지 않는다.
Enumerable.Distinct 유니티 C#에서도 사용 가능하다.

4.중복 리스트 제거
            List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };
            HashSet<int> set = new HashSet<int>();
            ages.RemoveAll(x => !set.Add(x));

            foreach (int age in ages)
            {
                Console.Write("{0} ", age);
            }

출력: 21 46 55 17

5. 차집합
            //list1 - list2 = 차집합
            List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
            List<int> list2 = new List<int> { 1, 3, 5 };

            List<int> result = Enumerable.ToList(Enumerable.Except(list1, list2));

            foreach (var v in result)
            {
                Console.Write("{0} ", v);
            }

출력: 2 4

List.Except 유니티 C#에서 지원하지 않는다.
Enumerable.Except 유니티 C#에서도 사용 가능하다.

6. 차집합
            //list1 - list2 = 차집합
            List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
            List<int> list2 = new List<int> { 1, 3, 5 };

            IEnumerable<int> result = Enumerable.Except(list1, list2);

            foreach (var v in result)
            {
                Console.Write("{0} ", v);
            }

출력: 2 4

위의 차집합과 같다. IEnumerable로 출력하고 있다.

7. 차집합
            //Difference between two lists
            List<int> oldList = new List<int> { 1, 2, 5, 8, 9 };
            List<int> newList = new List<int> { 1, 3, 7, 8, 9};
            List<int> diffList = new List<int>();

            for (int n = 0; n < newList.Count; ++n)
            {
                if (oldList.Contains(newList[n]) == false)
                    diffList.Add(newList[n]);
            }

            for (int n = 0; n < diffList.Count; ++n)
            {
                Console.Write("{0} ", diffList[n]);
            }

출력: 3 7

IEnumerable을 사용하지 않고 직접 구현 하였다. 유니티 C#에서 사용 가능하다.

8. 교집합
            //list1, list2 = 교집합
            List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
            List<int> list2 = new List<int> { 1, 3, 5, 6 };

            IEnumerable<int> result = Enumerable.Intersect(list1, list2);

            foreach (var v in result)
            {
                Console.WriteLine(v);
            }

표시: 1 3 5

List.Intersect 유니티 C#에서 지원하지 않는다.
Enumerable.Intersect 유니티 C#에서도 사용 가능하다.

9. 합집합
            //list1, list2 = 합집합
            List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
            List<int> list2 = new List<int> { 1, 3, 5, 6 };

            IEnumerable<int> result = Enumerable.Union(list1, list2);

            foreach (var v in result)
            {
                Console.Write("{0} ", v);
            }

출력: 1 2 3 4 5 6

List.Union 유니티 C#에서 지원하지 않는다.
Enumerable.Union 유니티 C#에서도 사용 가능하다.


10. HashSet로 합집합 구현
        //Hash union
        public class Person
        {
            public int Number { get; set; }
            public string Name { get; set; }

            public Person(int number, string name)
            {
                Number = number;
                Name = name;
            }
        }

        class PersonComparer : IEqualityComparer<Person>
        {
            public bool Equals(Person p1, Person p2)
            {
                return p1.Number == p2.Number;
            }

            public int GetHashCode(Person p)
            {
                return p.Number;
            }
        }

        public Test()
        {
            List<Person> list1 = new List<Person> { new Person(1, "one"), new Person(2, "two"), new Person(3, "three") };
            List<Person> list2 = new List<Person> { new Person(1, "one"), new Person(5, "two") };

            var hs = new HashSet<Person>(list1, new PersonComparer());
            hs.UnionWith(list2);
            var merged = hs.ToList();

            foreach (var person in merged)
            {
                Console.Write("{0} ", person.Number);
            }
        }

출력: 1 2 3 5

HashSet으로 합집합을 구현하고 있다. 유니티 C#에서도 사용 가능하다.
이외에도 ExceptWith, IntersectWith을 지원한다.

11. Dictionary로 합집합 구현
        public class Person
        {
            public int Number { get; set; }
            public string Name { get; set; }

            public Person(int number, string name)
            {
                Number = number;
                Name = name;
            }
        }

        public Test()
        {
            List<Person> list1 = new List<Person> { new Person(1, "one"), new Person(2, "two"), new Person(3, "three") };
            List<Person> list2 = new List<Person> { new Person(1, "one"), new Person(5, "two") };

            var dic = list2.ToDictionary(p => p.Number);

            foreach (var person in list1)
            {
                dic[person.Number] = person;
            }

            var merged = dic.Values.ToList();

            foreach (var person in merged)
            {
                Console.Write("{0} ", person.Number);
            }
        }

출력: 1 5 2 3

12. Linq 쿼리 이용
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;

namespace csharpTest
{
    class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Test
    {
        public Test()
        {
            IEnumerable<People> peopleList = new People[]
            {
                new People { Name = "kim", Age = 20},
                new People { Name = "lee", Age = 20},
                new People { Name = "park", Age = 15},
                new People { Name = "wang", Age = 15}
            };

            var query = from p in peopleList
                        where p.Age == 20
                        select p;

            foreach (var value in query)
            {
                Console.WriteLine(value.Name + ", " + value.Age);
            }
        }
    }
}

출력:
kim, 20
lee, 20

유니티 C#에서도 사용 가능하다.