C#/LINQ

[C#]LINQ 합치기 - Concat 메서드

DevStory 2022. 7. 17.

Concat 메서드

LINQ의 Concat() 메서드는 두 시퀀스를 하나의 시퀀스로 연결하기 위해 사용되며, 오버로드된 메서드는 존재하지 않습니다.

public static IEnumerable<TSource> Concat<TSource>(
  this IEnumerable<TSource> first, 
  IEnumerable<TSource> second);

따라서, Union(), Intersect(), Except() 메서드와 달리 IEqualityComparer 인터페이스를 매개변수로 사용하지 않습니다.


예제 1. int 타입의 List

다음 예제는 int 타입의 List에서 Concat() 메서드를 사용합니다. Concat() 메서드는 질의 구문에서 지원하지 않으므로 메서드 구문과 혼합해서 사용합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intArrayA = new List<int>() { 0, 2, 4, 5 };
    List<int> intArrayB = new List<int>() { 1, 2, 3, 5 };

    // 1. 질의 구문(Query Syntax) + 메서드 구문(Method Syntax)
    List<int> linqQueryResult = (from num in intArrayA
                                 select num).Concat(intArrayB).ToList();

    // 2. 메서드 구문(Method Syntax)
    List<int> linqMethodResult = intArrayA.Concat(intArrayB).ToList();

    Console.WriteLine("질의 구문 + 메서드 구문");
    foreach (int num in linqQueryResult)
      Console.Write(num + " ");

    Console.WriteLine("\n메서드 구문");
    foreach (int num in linqMethodResult)
      Console.Write(num + " ");
  }
}

[실행 결과]

질의 구문 + 메서드 구문
0 2 4 5 1 2 3 5
메서드 구문
0 2 4 5 1 2 3 5

예제 2. string 타입의 List

다음 예제는 string 타입의 List에서 Concat() 메서드를 사용합니다.

class Program
{
  static void Main(string[] args)
  {
    List<string> strArrayA = new List<string>() { "one", "two", "three" };
    List<string> strArrayB = new List<string>() { "One", "Two", "Three" };

    // 1. 질의 구문(Query Syntax) + 메서드 구문(Method Syntax)
    List<string> linqQueryResult = (from str in strArrayA
                                    select str).Concat(strArrayB).ToList();

    // 2. 메서드 구문(Method Syntax)
    List<string> linqMethodResult = strArrayA.Concat(strArrayB).ToList();

    Console.WriteLine("질의 구문 + 메서드 구문");
    foreach (string str in linqQueryResult)
      Console.Write(str + " ");

    Console.WriteLine("\n메서드 구문");
    foreach (string str in linqMethodResult)
      Console.Write(str + " ");
  }
}

[실행 결과]

질의 구문 + 메서드 구문
one two three One Two Three
메서드 구문
one two three One Two Three

예제 3. 사용자 정의 클래스

다음 예제처럼 사용자 정의 클래스를 List의 타입으로 정의 후 Concat() 메서드를 호출할 수 있습니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
  public override string ToString()
  {
    return "Name: " + Name + ", Age: " + Age;
  }
}

class Program
{
static void Main(string[] args)
  {
    List<Person> personA = new List<Person>
    {
      new Person{Name ="Bob", Age = 20},
      new Person{Name ="Tom", Age = 25},
      new Person{Name ="Sam", Age = 30}
    };

    List<Person> personB = new List<Person>
    {
      new Person{Name ="Ella", Age = 15},
      new Person{Name ="Bob",  Age = 20}
    };

    PersonComparer personComparer = new PersonComparer();

    // 1. 질의 구문(Query Syntax) + 메서드 구문(Method Syntax)
    List<Person> linqQueryResult = (from person in personA
                                    select person)
                                    .Concat(personB)
                                    .ToList();

    // 2. 메서드 구문(Method Syntax)
    List<Person> linqMethodResult = personA.Concat(personB).ToList();

    Console.WriteLine("질의 구문 + 메서드 구문");
    foreach (Person person in linqQueryResult)
      Console.WriteLine(person.ToString());

    Console.WriteLine("\n메서드 구문");
    foreach (Person person in linqMethodResult)
      Console.WriteLine(person.ToString());
  }
}

[실행 결과]

질의 구문 + 메서드 구문
Name: Bob, Age: 20
Name: Tom, Age: 25
Name: Sam, Age: 30
Name: Ella, Age: 15
Name: Bob, Age: 20

메서드 구문
Name: Bob, Age: 20
Name: Tom, Age: 25
Name: Sam, Age: 30
Name: Ella, Age: 15
Name: Bob, Age: 20

Union 메서드와 차이점

Concat() 메서드

- 중복 요소를 제거하지 않습니다.

- 오버로드된 메서드는 존재하지 않습니다.

 

Union() 메서드

- 중복 요소를 제거합니다.

- 오버로드된 메서드가 존재합니다.

- IEqualityComparer 인터페이스 구현 클래스의 인스턴스를 매개변수로 사용할 수 있으므로 두 시퀀스를 합치기 위한 특정 조건을 정의할 수 있습니다.

반응형

댓글