C \ # 자 바스 크 립 트 를 실현 하 는 Splice 방법

7654 단어
최근 자 바스 크 립 트 언어 를 배우 기 시 작 했 습 니 다. splice 방법 을 보 았 습 니 다. 이 방법 은 일반적인 요 소 를 삭제 하고 삽입 하 는 방법 입 니 다. 배열 이 지정 한 위치 에서 요 소 를 삭제 하거나 삽입 할 수 있 습 니 다.이 는 세 개의 매개 변 수 를 포함한다. 첫 번 째 매개 변 수 는 삽 입 된 시작 위 치 를 지정 하고 두 번 째 매개 변 수 는 요 소 를 삭제 할 개 수 를 지정 하 며 세 번 째 매개 변 수 는 삽 입 된 구체 적 인 요 소 를 표시 하고 삭 제 된 요소 배열 을 되 돌려 준다.이 방법 이 괜 찮 은 것 같 아서 C \ # 로 하 나 를 실현 해 보고 싶 습 니 다.
처음에는 확장 방법 으로 이 루어 질 생각 이 었 다. 그래 야 자 바스 크 립 트 의 용법 과 같 을 것 이다.곧 C \ # 의 배열 크기 가 고정 되 어 있 고 수정 할 수 없 으 며, 자바 script 의 splice 방법 은 배열 의 크기 를 동적 으로 바 꿔 야 한 다 는 것 을 알 게 되 었 다.C \ # 의 System. Array 류 는 배열 을 수정 하 는 방법 을 제공 하지 않 았 습 니 다. Clear () 방법 을 포함 하여 배열 의 모든 요 소 를 기본 값 (false, 0 또는 null) 으로 설정 합 니 다.Resize () 방법 은 새 배열 을 만 들 고 모든 요 소 를 새 배열 로 복사 하 는 것 입 니 다.결국 비교적 추 한 Helper 류 의 방식 으로 만 이 루어 질 수 있 습 니 다. 더 좋 은 방법 을 아 는 사람 이 있다 면 아낌없이 가르쳐 주 십시오.
수요 가 명확 하기 때문에 첫 번 째 테스트, 즉 배열 의 세 번 째, 네 번 째 요 소 를 삭제 하고 삭 제 된 요 소 를 되 돌려 주 는 것 입 니 다.TDD 는 좋 은 개발 방법 입 니 다. 목 표를 명확 하 게 하고 다음 에 무엇 을 해 야 하 는 지, 그리고 자신 이 목 표를 달 성 했 는 지 알 고 안심 하고 코드 를 재 구성 할 수 있 습 니 다.TDD 의 요구 에 따라 최소한 의 코드 로 테스트 요 구 를 달성 하 는 방법 을 한 걸음 한 걸음 설명 하지 않 고 Splice 방법 이 어떻게 작 동 하 는 지 설명 하기 위해 두 개의 테스트 를 직접 붙 입 니 다.이것 도 TDD 의 장점 중 하나 이 며, 테스트 는 예시 코드 이다.
        [Fact]
        public void TrancateTwoElements()
        {
            int[] a = { 1, 2, 3, 4, 5, 6 };

            int[] b = ArrayHelper.Splice(ref a, 2, 2);

            Assert.Equal(new int[] { 1, 2, 5, 6 }, a);
            Assert.Equal(new int[] { 3, 4 }, b);
        }

 
        [Fact]
        public void TrancateArrayAndInsertNewElements()
        {
            int[] a = { 1, 2, 3, 4, 5, 6 };

            int[] b = ArrayHelper.Splice(ref a, 2, 2, 7, 8, 9);

            Assert.Equal(new int[] { 1, 2, 7, 8, 9, 5, 6 }, a);
            Assert.Equal(new int[] { 3, 4 }, b);
        }

코드 의 전체적인 사고방식 은 삭 제 된 요소 와 남 은 요소 에 삽 입 된 새로운 요 소 를 저장 하 는 데 사용 되 는 두 개의 그룹 을 새로 만 든 다음 삭 제 될 요 소 를 삭 제 된 요 소 를 저장 하 는 데 사용 되 는 그룹 으로 복사 하고 원본 그룹 이 위 치 를 삭제 하기 전에 보존 해 야 할 요 소 를 새 그룹 으로 복사 하 는 것 이다.그리고 삽입 할 요 소 를 새 배열 로 복사 하고 마지막 으로 소스 배열 끝의 요 소 를 새 배열 로 복사 합 니 다.아니면 코드 로 말 하 는 것 이 회계 가 비교적 명확 하 다.
        public static T[] Splice(ref T[] sourceArray, int sourceIndex, int length, params T[] insertedElements)
        {
       //
// sourceIndex int acturalLength = (sourceIndex + length) > sourceArray.Length ? (sourceArray.Length - sourceIndex) : length;
var deletedItems = new T[acturalLength]; Array.ConstrainedCopy(sourceArray, sourceIndex, deletedItems, 0, acturalLength); int arrayLengthDifference = insertedElements.Length - acturalLength; int newArrayLength = sourceArray.Length + arrayLengthDifference; var newArray = new T[newArrayLength]; int newArrayCopyedElementsIndex = sourceIndex; Array.Copy(sourceArray, newArray, newArrayCopyedElementsIndex); Array.ConstrainedCopy(insertedElements, 0, newArray, newArrayCopyedElementsIndex, insertedElements.Length); newArrayCopyedElementsIndex += insertedElements.Length; int remainedElementsIndex = sourceIndex + acturalLength; // if (remainedElementsIndex < sourceArray.Length) { Array.ConstrainedCopy(sourceArray, remainedElementsIndex, newArray, newArrayCopyedElementsIndex, sourceArray.Length - remainedElementsIndex); } sourceArray = newArray; return deletedItems; }

완 료 된 코드 및 테스트 를 보십시오https://github.com/axbxcxdx/ZxbLib
이 코드 를 써 서 일상 적 으로 List 등 집합 류 에 익숙 하 다 는 것 을 느 꼈 습 니 다. 이 제 는 배열 로 조작 요 소 를 저장 하 는 것 이 C 언어 로 코드 를 쓰 는 느낌 으로 돌아 가 는 것 같 습 니 다. 배열 아래 표지, 배열 경계 와 배열 의 크기 에 주의해 야 합 니 다.
 
다음으로 전송:https://www.cnblogs.com/zhangxiaobin/p/9225019.html

좋은 웹페이지 즐겨찾기