목록 및 조각 패턴

팁 (조언)

이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 패턴이 새로운 경우 패턴 일치 개요 로 시작합니다. 지원되는 전체 형식 및 언어 규칙은 언어 참조의 목록 패턴을 참조하세요.

시퀀스의 모양 은 패턴에 필요한 관찰 가능한 속성 집합입니다. 이러한 속성에는 요소 수, 모든 요소 또는 전체 요소 시퀀스에 대해 작성된 요구 사항 및 특정 인덱스의 표식 값이 포함될 수 있습니다. 예를 들어, 셰이프는 인덱스 0에 "Name"가 있는 요소를 정확히 두 개 요구할 수도 있고, 첫 번째 마커와 마지막 마커, 그리고 그 사이의 비어 있지 않은 시퀀스를 요구할 수도 있습니다.

목록 패턴은 요소 개수 요구 사항을 순서가 지정된 위치에서 중첩된 패턴과 결합하여 셰이프를 설명합니다. 패턴으로 작성된 요구 사항만 테스트합니다. 요소 하위 패턴은 해당 요소를 테스트하고 조각 패턴 은 일치하지 않는 요소의 시퀀스를 허용하거나 테스트할 수 있습니다. 이러한 부분을 사용하여 정확한 개수 및 표식 값을 일치시키고, 고정된 위치에서 값을 캡처하거나, 일치하지 않는 중간을 허용하거나, 중첩된 패턴을 해당 가운데에 적용할 수 있습니다.

입력의 컴파일 타임 형식이 input[index] 또는 Length 속성과, Count와 같이 위치로 요소를 검색하는 인덱스된 요소 액세스를 제공하는 경우 목록 패턴을 선택합니다. 배열, List<T>문자열 및 범위가 일반적인 예입니다. 컴파일러는 프로그램이 실행되기 전에 이러한 필수 멤버를 해결해야 하므로 변수의 선언된 컴파일 시간 형식에서 자격을 결정합니다. IEnumerable<T> 인터페이스 자체는 런타임 개체가 인덱싱 가능한 컬렉션인 경우에도 해당 멤버 대신 열거형을 제공합니다.

목록 패턴은 열거형 대신 길이 또는 개수 및 인덱싱된 요소 액세스를 사용합니다. 일반적인 기본 제공 타입의 경우, 매칭은 모든 요소를 순회하는 대신 패턴에 지정된 위치만 확인할 수 있습니다. 이러한 작업의 비용은 입력 형식에 따라 달라집니다. 긴 컬렉션을 반복하는 데 시간이 걸릴 수 있으므로 결정 시 특정 위치가 아닌 임의의 요소 수를 검사해야 하는 경우 루프 또는 LINQ를 사용합니다.

정확한 도형에 맞추기

다음 메서드는 두 열 헤더를 인식합니다:

static bool IsHeader(string[] columns) =>
    columns is ["Name", "Score"];

columns 식은 패턴 입력값입니다. ["Name", "Score"] 에는 두 개의 상수 패턴이 포함되어 있습니다. 정확한 목록 패턴은 조각 패턴을 생략하고 정확히 두 개의 요소가 필요하며 각 중첩 패턴을 동일한 인덱스의 요소에 적용합니다. 이 패턴은 정확한 개수와 두 개의 마커 값, 즉 인덱스 0의 "Name" 및 인덱스 1의 "Score"를 갖는 형태를 설명합니다. 중첩된 요소 패턴은 선택 사항입니다. 빈 목록 패턴 [] 은 요소가 없는 시퀀스를 설명하고 일치합니다.

셰이프가 요소 개수와 정렬된 위치의 요구 사항을 결합할 때 목록 패턴을 선택합니다. 요소의 개수만 중요하다면 Count와 같은 Length 또는 items is { Count: 0 } 속성 패턴이 해당 의도를 더 직접적으로 나타냅니다.

버림값을 사용하여 어떤 요소 값과도 일치시킵니다

다음 메서드는 이름 세 개로 이루어진 순위 목록에서 우승자와 3위 선수를 읽어 옵니다.

static string GetAnnouncements(List<string> finishingOrder) =>
    finishingOrder switch
    {
        [var winner, _, var thirdPlace] =>
            $"Winner: {winner}; third place: {thirdPlace}",
        _ => "A complete three-runner result isn't available"
    };

var thirdPlace 및 var winner 패턴은 각각 변수를 선언합니다. 목록 패턴이 일치하면 C#은 해당 위치에서 일치한 요소 값을 해당 변수에 할당하므로 결과에서 winner 및 thirdPlace을 사용할 수 있습니다. 무시 패턴 _ 은 두 번째 요소를 허용하고 해당 값을 삭제합니다. 이 셰이프에는 정확히 세 개의 요소가 필요하며 첫 번째 및 세 번째 위치에 특정 의미를 부여하지만 어떤 위치에서도 특정 값이 필요하지 않습니다.

고정된 위치에 안정적인 의미가 있는 경우 이 양식을 선택합니다. 임의 개수의 요소를 검사하거나, 시퀀스를 변환하거나, 전체에서 검색하거나, 집계를 수행해야 하는 경우 루프 또는 LINQ를 사용합니다.

슬라이스 패턴을 사용한 나머지 요소를 허용

이 간소화된 예제에서 명령줄은 다른 인수로 --verbose 시작하고 포함할 수 있으며 입력 파일 이름으로 끝나는 것으로 간주됩니다. 다음 메서드는 마지막 위치에 파일 이름을 가진 셰이프를 인식하고 해당 값을 캡처합니다.

static string GetInputFile(string[] arguments) =>
    arguments switch
    {
        ["--verbose", .., var fileName] => $"Verbose processing: {fileName}",
        [.., var fileName] => $"Processing: {fileName}",
        [] => "No input file was provided"
    };

조각 패턴..은 첫 번째 및 마지막 요소 패턴 사이에 0개 이상의 나머지 요소를 허용합니다. 목록 패턴에는 최대 하나의 조각 패턴이 포함될 수 있습니다. 첫 번째 스위치 암은 인덱스 0의 표식 "--verbose" , 마지막 위치의 파일 이름 및 둘 사이의 일치하지 않는 인수 수 등 두 개 이상의 요소가 있는 셰이프를 설명합니다. 독립 실행형 조각은 이러한 중간 인수를 테스트하지 않습니다. 두 번째 암은 아무 것도 없는 도형을 허용하고 마지막 요소를 캡처하는 반면 빈 패턴은 요소 없이 시퀀스를 처리합니다.

조각은 목록 패턴의 시작, 가운데 또는 끝에 나타날 수 있습니다. 가변 길이 시퀀스가 셰이프의 일부이지만 주변 위치만 요소 테스트가 필요한 경우 사용합니다. 모든 요소에 처리가 필요한 경우 일반 반복을 사용합니다.

조각에 패턴 적용

일치하는 ..파트에 다른 패턴을 적용할 수 있습니다. 다음 메서드는 배열이 로 "BEGIN"시작하는지, 끝으로 "END"끝나는지, 둘 사이에 요소가 하나 이상 있는지 테스트합니다.

static bool HasContent(string[] entries) =>
    entries is ["BEGIN", .. { Length: > 0 }, "END"];

외부 패턴은 먼저 인덱스 0에 "END" 마커가 있고 마지막 인덱스에 "BEGIN" 마커가 있을 것을 요구합니다. 그런 다음 속성 패턴 { Length: > 0 } 은 조각과 일치하는 시퀀스에 대한 요구 사항을 추가합니다. 하나 이상의 요소를 포함해야 합니다. 이러한 요구 사항은 전체 셰이프를 설명합니다. 패턴은 조각 내의 요소 값을 테스트하지 않습니다.

중간 부분 자체에 테스트 또는 캡처가 필요한 경우에만 조각 하위 페이턴을 사용합니다. 경계 요소만 중요한 경우 일반 .. 이 더 간단합니다.

참고하십시오