공개 릴리스 용 라이브러리를 개발 중입니다. 여기에는 집합을 생성, 검사, 분할 및 새로운 형태로 투영하는 다양한 개체 집합에 대한 다양한 방법이 포함되어 있습니다. 관련이있는 경우 IEnumerable
NuGet 패키지로 릴리스되는 LINQ 스타일 확장이 포함 된 C # 클래스 라이브러리 입니다.
이 라이브러리의 일부 메소드에는 만족할 수없는 입력 매개 변수가 제공 될 수 있습니다. 예를 들어, 조합 방법에는 m 개의 소스 세트로부터 구성 될 수있는 n 개의 모든 세트의 세트를 생성하는 방법이 있다 . 예를 들어 다음과 같이 설정하면
1, 2, 3, 4, 5
2의 조합을 요청하면 다음이 생성됩니다.
1, 2
1, 3
1, 4
등 ...
5, 3
5, 4
이제 3 개 항목 세트를 제공 한 다음 4 개 항목의 조합을 요청하는 동안 각 항목을 한 번만 사용할 수 있다는 옵션을 설정하는 등 수행 할 수없는 작업을 요청할 수 있습니다.
이 시나리오에서 각 매개 변수는 개별적으로 유효합니다.
- 소스 콜렉션이 널이 아니며 항목을 포함합니다.
- 요청 된 조합 크기는 0이 아닌 양의 정수입니다.
- 요청 된 모드 (각 항목을 한 번만 사용)는 올바른 선택입니다
그러나 매개 변수 상태를 합하면 문제가 발생합니다.
이 시나리오에서 메소드가 예외 (예 :)를 발생 InvalidOperationException
시키거나 빈 콜렉션을 리턴 할 것으로 예상 하십니까? 나에게 유효한 것 같습니다 :
- 각 항목을 한 번만 사용할 수 있으면 n> m 인 m 항목 세트에서 n 항목의 조합을 생성 할 수 없으므로이 작업은 불가능한 것으로 간주 됩니다.
InvalidOperationException
- n> m 이 빈 세트 일 때 m 개의 아이템 으로부터 생성 될 수있는 크기 n 의 조합 세트; 조합을 만들 수 없습니다.
빈 세트에 대한 인수
첫 번째 관심사는 알 수없는 크기의 데이터 집합을 처리 할 때 예외로 인해 관용적 인 LINQ 스타일의 메서드 체인이 방지된다는 것입니다. 즉, 다음과 같은 작업을 수행 할 수 있습니다.
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
입력 세트의 크기가 가변적이면이 코드의 동작을 예측할 수 없습니다. 경우 .CombinationsOf()
경우 예외를 throw someInputSet
미만의 4 개 요소를 가지고,이 코드는 것입니다 때로는 몇 가지 사전 검사없이 런타임에 실패합니다. 위의 예에서이 검사는 사소한 것이지만 더 긴 LINQ 체인을 반쯤 호출하면 지루할 수 있습니다. 빈 세트를 반환하면 비어 result
있을 것입니다.
예외에 대한 논쟁
두 번째 관심사는 빈 세트를 반환하면 문제를 숨길 수 있다는 것입니다. LINQ 체인의 절반 아래에서이 메소드를 호출하고 빈 세트를 조용히 반환하면 몇 단계 후에 문제가 발생하거나 비어있는 것으로 스스로를 찾을 수 있습니다 결과 집합이 있고 입력 집합에 확실하게 무언가가있는 경우 어떻게 발생했는지 분명하지 않을 수 있습니다.
당신은 무엇을 기대하고 그것에 대한 당신의 주장은 무엇입니까?