개발/C#
[C#] LINQ, 객체 속성 예외/중복 삭제(차집합)
한번사는인생.
2020. 11. 2. 17:51
반응형
예제를 보면서 이번 포스팅의 주제를 설명해보려 한다.
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 즉, 차집합을 구하고 싶었다.
이때 생각했던 방법 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를 해준다.
간단한 내용이지만, 다른 분들에게 도움이 될 수도 있는 코드를 정리해본다.
반응형