■ GroupBy 확장 메소드 : 객체 컬렉션의 특정 객체 속성 값의 집합 구하기 (속성 2개 이상 지정 가능)

----------------------------------------------------------------------------------------------------

Program.cs

 

using System;

using System.Collections.ObjectModel;

using System.Linq;

 

namespace TestProject

{

    /// <summary>

    /// 프로그램

    /// </summary>

    public class Program

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

 

        #region 프로그램 시작하기 - Main()

 

        /// <summary>

        /// 프로그램 시작하기

        /// </summary>

        private static void Main()

        {

            ObservableCollection<Employee> collection = Employee.GetCollection();

 

            string[] propertyNameArray = new string[] { "ID", "Sex" };

 

            var result = collection.AsEnumerable().GroupBy(item => new Tuple<object>(from propertyName in propertyNameArray select item.GetType().GetProperty(propertyName).GetValue(item)));

 

            foreach(var group in result)

            {

                foreach(var keyValue in group.Key.ValueArray)

                {

                    Console.Write(keyValue);

                    Console.Write(":");

                }

 

                Console.WriteLine();

            }

 

        }

 

        #endregion

    }

}

 

Tuple.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

 

namespace TestProject

{

    /// <summary>

    /// 튜플

    /// </summary>

    /// <typeparam name="T">타입</typeparam>

    public class Tuple<T> : IEquatable<Tuple<T>>

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region Field

 

        /// <summary>

        /// 값 배열

        /// </summary>

        public readonly T[] ValueArray;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - Tuple(enumerable)

 

        /// <summary>

        /// 생성자

        /// </summary>

        /// <param name="enumerable">열거 가능 목록</param>

        public Tuple(IEnumerable<T> enumerable)

        {

            ValueArray = enumerable.ToArray();

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 동등 여부 조사하기 - Equals(sourceTuple)

 

        /// <summary>

        /// 동등 여부 조사하기

        /// </summary>

        /// <param name="sourceTuple">소스 Tuple</param>

        /// <returns>동등 여부</returns>

        public bool Equals(Tuple<T> sourceTuple)

        {

            if(ReferenceEquals(this, sourceTuple))

            {

                return true;

            }

 

            if(sourceTuple == null)

            {

                return false;

            }

 

            int length = ValueArray.Length;

 

            if(length != sourceTuple.ValueArray.Length)

            {

                return false;

            }

 

            for(int i = 0; i < length; i++)

            {

                if(!Equals(ValueArray[i], sourceTuple.ValueArray[i]))

                {

                    return false;

                }

            }

 

            return true;

        }

 

        #endregion

 

        #region 동등 여부 조사하기 - Equals(sourceObject)

 

        /// <summary>

        /// 동등 여부 조사하기

        /// </summary>

        /// <param name="sourceObject">소스 객체</param>

        /// <returns>동등 여부</returns>

        public override bool Equals(object sourceObject)

        {

            if(ReferenceEquals(this, sourceObject))

            {

                return false;

            }

 

            if(sourceObject == null)

            {

                return false;

            }

 

            return Equals(sourceObject as Tuple<T>);

        }

 

        #endregion

 

        #region 해시 코드 구하기 - GetHashCode()

 

        /// <summary>

        /// 해시 코드 구하기

        /// </summary>

        /// <returns>해시 코드</returns>

        public override int GetHashCode()

        {

            int hashCode = 17;

 

            foreach(var value in ValueArray)

            {

                hashCode = hashCode * 37 + (!ReferenceEquals(value, null) ? value.GetHashCode() : 0);

            }

 

            return hashCode;

        }

 

        #endregion

    }

}

 

Employee.cs

 

using System.Collections.ObjectModel;

 

namespace TestProject

{

    /// <summary>

    /// 직원

    /// </summary>

    public class Employee

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region ID - ID

 

        /// <summary>

        /// ID

        /// </summary>

        public string ID { get; set; }

 

        #endregion

 

        #region 성명 - Name

 

        /// <summary>

        /// 성명

        /// </summary>

        public string Name { get; set; }

 

        #endregion

 

        #region 성별 - Sex

 

        /// <summary>

        /// 성별

        /// </summary>

        public string Sex { get; set; }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Public

 

        #region 컬렉션 구하기 - GetCollection()

 

        /// <summary>

        /// 컬렉션 구하기

        /// </summary>

        /// <returns>컬렉션</returns>

        public static ObservableCollection<Employee> GetCollection()

        {

            ObservableCollection<Employee> collection = new ObservableCollection<Employee>();

 

            for(int i = 0; i < 100000; i++)

            {

                collection.Add(new Employee() { ID = (i % 5).ToString(), Name = "직원" + i.ToString(), Sex = (i % 10 == 1 ? "남" : "여")});

            }

 

            return collection;

        }

 

        #endregion

    }

}

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG