C \ # 자 바스 크 립 트 를 실현 하 는 Splice 방법
처음에는 확장 방법 으로 이 루어 질 생각 이 었 다. 그래 야 자 바스 크 립 트 의 용법 과 같 을 것 이다.곧 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.