반응형

 

예제를 보면서 이번 포스팅의 주제를 설명해보려 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static void Main() {
    var obj1 = new List<Book>() {
        new Book() { Index = 1, Title = "차차", Author = "망토" },
        new Book() { Index = 2, Title = "차차차", Author = "두건" },
        new Book() { Index = 3, Title = "가가가", Author = "알레" },
        new Book() { Index = 4, Title = "나나", Author = "베토벤" },
        new Book() { Index = 7, Title = "럭스", Author = "스웨인" }
    };
    
   var obj2 = new List<Book>() {
        new Book() { Index = 5, Title = "누누", Author = "토마스" },
        new Book() { Index = 6, Title = "아칼리", Author = "마오카이" },
        new Book() { Index = 3, Title = "가가가", Author = "알레" },
        new Book() { Index = 4, Title = "나나", Author = "베토벤" }
    };
}
 
 
public class Book {
    public int Index { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    
    private void Clear() {
        Index = 0;
        Title = string.Empty;
        Author = string.Empty;
    }
    
    public Book() {
        Clear();
    }
}
cs

Book이라는 클래스가 있다.

그리고 obj1 / obj2 2가지 객체를 생성하면서 데이터를 초기화해주었다.

 

이때, obj1의 Index값을 기준으로 obj2에 있는 Index 값을 제외하고 싶었다.

obj1.Index - obj2.Index 즉, 차집합을 구하고 싶었다.

 

A - B, 차집합

이때 생각했던 방법 2가지가 있었다.

첫 번째로 생각난 방법은 except라는 Linq 메서드.

하지만 except는 모든 속성 값들이 동일해야지 비교가 가능했다. 

나는 Book이라는 클래스의 Index 속성값만 가지고 차집합을 구하고 싶었기 때문에, except 메서드를 사용할 수 없었다.

 

그리고 두번째 생각했던 방법은 Loop를 이용해서 일일이 비교하는 방법을 생각했다.

하지만...... 이제는 이렇게 할 짬밥(?)이 아니라 생각했기에 금방 마음을 접었다.

 

그래서 생각해낸 방법은?

1
2
3
4
5
var result = obj1.Where(i => !obj2.Any(j => j.Index == i.Index)).ToArray();
        
foreach (var item in result) {
    Console.WriteLine(item.Index);
}
cs

Where / Any 메서드를 사용하는 방법이다.

Where 메서드는 누가 봐도 조건절이라는 것을 알 수 있다.

생소한 Any 메서드에 대해 설명하자면,

만족하는 값이 하나라도 있으면 true, 없으면 false를 리턴해주는 메서드이다.

 

Where / Any 메서드를 사용한 1번째 라인을 설명해보면,

obj1의 Index 속성값이 obj2의 Index 같은 값이 하나라도 있으면 true, 없으면 false를 해준다.

 

obj2 중복값인 3, 4가 제외된 obj1 Index 값 출력.

 

간단한 내용이지만, 다른 분들에게 도움이 될 수도 있는 코드를 정리해본다.

 

반응형

+ Recent posts