적당한 집합

얼마 전에 나는 어떻게 하는지에 관한 문장을 한 편 썼다.비평은 절대적으로 옳지만, 내가 더 좋은 해결 방안을 내놓아 이런 문제들을 피할 수 있다면 더욱 좋겠다.
Set<TElement> 을 입력합니다.나는 여전히 공공 API를 100% 확정할 수 없고 전체 프로젝트가 테스트 단계에 있기 때문에 내가 자랑하는 일을 어떻게 하는지에 대해 더 좋은 생각을 가지고 있다면, 내가 그것을 연구할 수 있다는 것을 알려주십시오.
우선 인터페이스가 없습니다.반대로 이것은 추상적인 유형입니다. 파생할 수 있지만 라이브러리에 내부 파생이 있습니다. 직접 접근할 수 없지만, 최종적으로 사용할 것입니다.나는 이것이 실천에서 의의가 있다고 보증한다.
이것은 내가 본 집합을 실현하는 전형적인 방식이 아니라 가변적인 데이터 구조가 아니다.반대로 그것은 어떤 원소부터 영원히 존재한다.반대로 당신은 집합 대수를 통해 더욱 복잡한 집합을 만들 수 있으며 집합 대수는 정의가 좋은 공리와 이용할 수 있는 항등식이 있다.하지만 가장 기본적인 장면부터 소개해 드리겠습니다.
readonly Set<Int32> smallPrimes = Set.From(2, 3, 5, 7);
이때 smallPrimes은 변경할 수 없습니다. 실례는 변할 수 없기 때문에 인용은 readonly입니다.테스트 집합의 존재성은 간단하면서도 뚜렷하다.
Assert.True(smallPrimes.Contains(5));
Assert.False(smallPrimes.Contains(6));
Assert.False(smallPrimes.Contains(11));
그러나 또 다른 간단한 설정이 있다. 우리가 포괄해야 한다!ISet<T>에서 우리는 한 그룹의 모든 짝수나 홀수, 또는 짝수만을 어떻게 정의할 것인가를 고려해 봅시다!32비트 정수의 표준 짝수 집합은 8589934588바이트의 메모리를 차지합니다!나는 너의 상황을 모르겠지만, 나는 이런 방법을 사용할 수 있는 컴퓨터가 한 대도 없다.나는 마이크로소프트가 아니다. 왜냐하면 그것은 서버장과 분포식 계산 기술에 수백만 달러를 썼기 때문이다.어쩌면 이것이 그들이 무관심한 이유일지도 모른다.🤔
readonly Set<Int32> evens = Set.From((x) => x % 2 == 0);
축하합니다. 당신은 지금 짝수가 생겼습니다. 게다가 그것은 당신의 컴퓨터를 폭발시키지 않을 것입니다.
다음 그룹도 고려해야 합니다.
readonly Set<Int32> odds = Set.From((x) => x % 2 != 0);
readonly Set<Int32> positive = Set.From(x) => x > 0);
readonly Set<Int32> negative = Set.From(x) => x < 0);
readonly Set<Int32> empty = Set.Empty<Int32>();
readonly Set<Int32> universe = Set.Universe<Int32>();
빈 집합은 명백히 알 수 있다. 그것은 원소가 없는 집합이다.우주는 그리 뚜렷하지는 않지만, 그것은 공집의 찬미이다. 우주는 모든 원소를 포함하는 집합이다.
그래, 우리는 모든 숫자, 모든 짝수, 그리고 모든 홀수에 대해 집합을 정의했다. 이 모든 것은 한 줄 코드에 있다.
대수 시간에 항등식이 있었던 것을 기억하십니까?그것들은 보통 0 또는 1으로 x/x = 1 또는 x-x = 0 또는 x+0 = x과 같다.전체적으로 보면 수학에 매우 유용하다. 특히 신분이 없는 0세기에는 문제가 비일비재했다.집합 대수에서 공집과 우주집은 바로 이런 항등식이다.이런 항등식 없이 집합 대수를 시도해 보는 것은 마치 01이 없는 상황에서 추상 대수를 시도해 보는 것과 같다.너는 매우 불쾌하게 지낼 것이다.
간단한 대수 연산에서 그것들을 사용하자.
readonly Set<Int32> positiveEvens = positive & evens;
여기, 우리는 모든 정수와 모든 짝수 사이의 교집만 했다.그 어떤 음수도 짝수든 홀수든 진정한 존재성을 검증하지 못한다. 설령 그 중의 한 구성집이 사실이라고 해도.
이 목적에 사용되는 연산자를 이해할 수 있는 아주 유용한 방법이 있습니다. 두 개의 그룹의 존재성을 테스트할 때 어떤 연산자를 사용하시겠습니까?이런 상황에서, 당신은 '정수 그룹' 과 '짝수 그룹' 을 통해 순환한다. 이 두 그룹이 모두 존재할 때만 집합의 일부분이다.
readonly Set<Int32> oddsWithoutSmallPrimes = odds - smallPrimes;
여기서 우리는 기수집과 모든 소수집 사이의 차이만 만들었다.그러니 위로 굴러갈 필요가 없다. smallPrimes[2, 3, 5, 7]으로 정의된다.모든 홀수에서 2을 꺼내는 것은 처음부터 존재하지 않았기 때문이다.나머지는 빼면 테스트 결과가 가짜가 된다.
Assert.True(oddsWithoutSmallPrimes.Contains(1));
Assert.False(oddsWithoutSmallPrimes.Contains(2));
Assert.False(oddsWithoutSmallPrimes.Contains(3));
Assert.False(oddsWithoutSmallPrimes.Contains(5));
Assert.False(oddsWithoutSmallPrimes.Contains(7));
Assert.True(oddsWithoutSmallPrimes.Contains(9));
Assert.True(oddsWithoutSmallPrimes.Contains(11));
일리가 있었으면 좋겠어요.
전반적으로 다음 컬렉션 작업은 해당 C# 연산자로 정의됩니다.
C#
설정 작업
-
차이점
!
보태다
&
엇갈리다
^
분석하다
|
연합회
마찬가지로 모든 연산자는 자신이 이 연산자를 테스트할 때 실행할 등효 논리 연산자와 대응하도록 선택된다.물론 -을 제외하고는 추상 대수의 차이다.
그렇다면 이 모든 것은 어떻게 작동되는 것일까?이모티콘 트리를 통해이는 LINQ expression trees과는 무관하다는 점을 지적할 만하다.반대로 이것은 실제 데이터 구조로 그 자체가 일종의 다중 트리이다.어떤 텍스트 집합도 수정되지 않지만, 집합 연산자는 표현식을 작성할 때 이 표현식을 나타내는 트리를 구축하고, 이 트리를 새로운 집합으로 되돌려줍니다.처음에는 비싼 것 같았지만, 집합이 얼마나 많은 메모리를 절약했는지 설명하기 위해 의뢰를 사용한 것을 기억하십니까?표현식 트리는 아주 간단한 사용법에만 한정되어 있지만 실제로는 더 많은 절약을 할 수 있다.모든 집합은 변할 수 없기 때문에 우리는 집합을 뛰어넘어 자유롭게 그것들을 다시 사용할 수 있다. 이것은 집합의 임의의 조합이 기존의 실례를 다시 사용해서 더 많은 메모리를 절약할 수 있다는 것을 의미한다.아주 좋아요.
지금 목록, 나무, 혹은 다른 것을 원한다면, 유일한 원소의 예는 무엇입니까?요소가 이미 컬렉션에 있으면 다시 추가할 수 없습니다.나는 너에게 알려줄 소식이 있다.그것은 한 세트가 아니다.기본 시리즈가 무엇이든 간에 이것은 유일무이한 것이다. 이것은 그 자체의 개념이다.둘을 결합시키는 것은 ISet<T>이 이렇게 복잡하고 불규칙한 추상적인 중요한 원인이다.

좋은 웹페이지 즐겨찾기