제네릭은 C# 버전 2.0에 추가되었으며 언어에서 가장 중요한 개념 중 하나입니다. 컴파일 타임에 형식이 안전한 재사용 가능한 고성능 코드를 작성할 수 있습니다. 제네릭을 사용하면 미리 알지 못하는 상태에서 코드에서 유형을 사용할 수 있습니다. 제네릭은 컬렉션, 대리자 및 비동기 코드를 포함하여 .NET의 여러 위치에서 사용됩니다. 제네릭을 사용하면 컬렉션의 크기를 미리 알 필요가 없으며 코드에 특정한 사용자 지정 데이터 형식을 포함하여 모든 요소 형식에 제네릭을 사용할 수 있습니다. C#은 제네릭 유형(클래스, 인터페이스 등)과
C 프로그래머라면 대리자를 함수에 대한 포인터로 생각할 수 있습니다. 그러나 C#의 대리자는 단순한 함수 포인터 그 이상입니다. 이 문서에서는 대리인의 개념과 일상적인 프로그래밍에서 대리자를 사용하는 방법을 설명합니다. 기본적으로 대리자는 간접적인 수준을 제공합니다. 유형이 안전한 방식으로 전달되고 실행될 수 있는 코드 조각을 캡슐화합니다. 동작을 즉시 실행하는 대신 개체에 포함됩니다. 해당 개체에 대해 여러 작업을 수행할 수 있으며 그 중 하나는 포함된 동작을 실행하는 것입니다. 대리자를 사용하면 고차 함수, 즉 매개변수로 함
인터페이스는 클래스 또는 구조체에 의해 구현될 계약을 정의합니다. 여기에는 메서드, 속성, 이벤트 및 인덱서가 포함될 수 있습니다. 인터페이스는 데이터를 보유하지 않고 수행할 수 있는 동작(더 정확하게는 구현하는 클래스가 수행할 수 있음)만 지정한다는 점을 제외하고는 클래스와 유사합니다. 클래스는 하나 이상의 인터페이스를 구현할 수 있습니다. 인터페이스 멤버를 구현하려면 클래스에 인터페이스 멤버와 동일한 메서드 정의, 즉 동일한 이름과 서명을 가진 공용 멤버가 있어야 합니다. 예를 들어 IComparer는 두 개체를 비교하는 메
C#에는 null 값을 처리하기 위해 다음 세 가지 연산자가 있습니다. - 널 병합 연산자(??) null이 아닌 경우 변수 값을 가져오거나 사용할 수 있는 기본값을 지정할 수 있습니다. C#에서 다음 표현식을 대체합니다. − string resultOne = value != null ? value : "default_value"; 다음 표현식으로 - string resultTwo = value ?? "default_value"; 다음은 이를 보여주는 예입니다. 예 using Syste
C#에서 const 및 readonly 키워드는 선언된 후에는 수정할 수 없는 변경할 수 없는 값을 정의하는 데 사용됩니다. 그러나 둘 사이에는 몇 가지 중요한 차이점이 있습니다. 상수 const 수정자는 컴파일 타임에 알려지고 변경되지 않는 상수 값을 선언합니다. 즉, 변경할 수 없습니다. C#에서는 기본 제공 형식만 const로 표시할 수 있습니다. 클래스, 구조체 등과 같은 사용자 정의 유형은 const일 수 없습니다. 또한 메서드, 속성 또는 이벤트와 같은 클래스 멤버 유형은 상수로 표시할 수 없습니다. 선언하는 동안 상
배열은 주어진 유형의 고정된 수의 요소를 나타냅니다. 요소는 연속적인 메모리 블록에 저장되며 요소의 인덱스를 알고 있는 한 요소에 매우 효율적으로 액세스할 수 있습니다. 배열을 선언하고 초기화하는 C# 구문은 다음과 같습니다 - // create a string array to hold 5 languages string[] languages = new string[3]; 배열이 선언되면 배열의 제곱 표기법을 사용하여 배열의 항목을 채울 수 있습니다. languages[0] = "csharp"; languages
.NET에는 타사 라이브러리를 포함하는 경우 많은 네임스페이스가 포함되어 있습니다. 그러나 계속해서 사용할 몇 가지가 있습니다. 다음은 일반적이고 반복적으로 발생하는 프로그래밍 문제의 80%를 해결하는 20가지 방법입니다. 시스템 가장 기본적인 유형을 포함합니다. 여기에는 일반적으로 사용되는 클래스, 구조, 열거형, 이벤트, 인터페이스 등이 포함됩니다. 시스템.텍스트 ASCII 및 유니코드 문자 인코딩을 나타내는 클래스를 포함합니다. 문자 블록을 바이트 블록으로 변환하는 클래스. System.Text.RegularExpressi
C#에서 문자열은 변경할 수 없습니다. 즉, 문자열이 생성되면 수정할 수 없습니다. 문자열을 수정하면 수정 사항이 포함된 새 문자열이 반환되며 원래 문자열은 그대로 유지됩니다. string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc StringBuilder
C#의 System.Reflection 네임스페이스 C#의 System.Reflection 네임스페이스에는 메타데이터를 검사하여 코드의 어셈블리, 모듈, 멤버, 매개 변수 및 기타 항목에 대한 정보를 제공하는 형식이 포함되어 있습니다. 이 네임스페이스의 Assembly 클래스는 어셈블리를 나타냅니다. 일반적으로 Type의 Assembly 속성을 사용하여 액세스할 수 있습니다. 어셈블리의 아이덴티티는 4개의 항목으로 구성됩니다 - 간단한 이름 major.minor.build.revision 형식의 AssemblyVersion 속성
종속성은 다른 개체가 의존하는 개체입니다. 종속성 주입(또는 반전)은 기본적으로 개체 자체를 구성하는 대신 개체에 필요한 개체를 제공합니다. 종속성을 모의할 수 있으므로 테스트를 더 쉽게 만드는 유용한 기술입니다. 예를 들어 클래스 A가 클래스 B의 메서드를 호출하고 이 메서드가 클래스 C의 메서드를 호출하면 A는 B에 종속되고 B는 C에 종속됨을 의미합니다. 종속성 주입을 사용하여 클래스 C의 인스턴스를 클래스 B에 전달할 수 있습니다. , 그리고 B와 C의 인스턴스를 구성하기 위해 이러한 클래스를 사용하는 대신 B의 인스턴스를
왼쪽 위에서 오른쪽 아래까지의 모든 대각선이 동일한 요소를 갖는 경우 행렬은 Toeplitz입니다. 예시 1 [[1,2,3,4], [5,1,2,3], [9,5,1,2]] 출력 - true 위의 그리드에서 대각선은 - "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]". 각 대각선에서 모든 요소는 동일하므로 정답은 참입니다. 예시 2 Input: matrix [[
이 문제에 대한 기본 솔루션은 입력 행렬에 저장된 모든 요소를 스캔하여 주어진 키를 검색하는 것입니다. 이 선형 탐색 방식은 행렬의 크기가 MxN인 경우 O(MN) 시간이 소요됩니다. 행렬은 정렬된 1차원 배열로 볼 수 있습니다. 입력 행렬의 모든 행이 하향식 순서로 연결되면 정렬된 1차원 배열을 형성합니다. 그리고 이 경우 이진 탐색 알고리즘이 이 2D 배열에 적합합니다. 아래 코드는 2차원 배열과 검색 키를 입력으로 받아 검색 키의 성공 또는 실패에 따라 true 또는 false를 반환하는 SearchRowwiseColum
이 문제에 대한 기본 솔루션은 입력 행렬에 저장된 모든 요소를 스캔하여 주어진 키를 검색하는 것입니다. 이 선형 탐색 방식은 행렬의 크기가 MxN인 경우 O(MN) 시간이 소요됩니다. 행렬은 오른쪽 상단에서 스캔해야 합니다. 검색 요소가 오른쪽 상단 요소보다 크면 행이 증가하고 그렇지 않으면 열이 감소합니다. 아래 코드는 2차원 배열과 검색 키를 입력으로 받아 찾은 검색 키의 성공 또는 실패에 따라 true 또는 false를 반환하는 SearchRowwiseIncrementedMatrix 함수를 개발합니다. 코드 public
쉬운 방법은 세 개의 중첩 루프를 만들고 세 요소의 합계가 0인지 여부를 하나씩 확인할 수 있다는 것입니다. 세 요소의 합이 0이면 요소를 인쇄합니다. 시간 복잡성 - O(n3 ) 공간 복잡성 - O(1) 우리는 정렬되지 않은 집합 데이터 구조를 사용하여 배열의 각 값을 저장할 수 있습니다. Set은 O(1) 시간에 요소를 검색하는 이점을 제공합니다. 따라서 배열의 각 쌍에 대해 집합에 존재할 수 있는 합계의 음수를 찾습니다. 그러한 요소가 발견되면 정수 쌍과 그 합계의 음수 값이 될 3중항을 인쇄할 수 있습니다. 시간 복잡성 -
2개의 다른 배열 leftDis 및 rightDis를 만듭니다. leftDis는 왼쪽에서 이동할 때 값을 저장합니다. rightDis는 오른쪽에서 이동할 때 가장 짧은 값을 저장합니다. 문자가 만날 때마다 문자의 위치를 배열에 추가하십시오. 마지막 단계에서 두 배열의 최소값을 계산합니다. 시간 복잡성 - 오(n) 공간 복잡성 - 오(n) 예시 public class Arrays{ public int[] ShortestDistanceToCharacter(string s, char c){ &nbs
2개의 다른 배열 leftDis 및 rightDis를 만듭니다. leftDis는 왼쪽에서 이동할 때 값을 저장합니다. rightDis는 오른쪽에서 이동할 때 가장 짧은 값을 저장합니다. 문자가 만날 때마다 문자의 위치를 배열에 추가하십시오. 마지막 단계에서 두 배열의 최대값을 계산합니다. 시간 복잡성 - 오(n) 공간 복잡성 - 오(n) 예시 public class Arrays{ public int[] LongestDistanceToCharacter(string s, char c){ &nb
Two Pointers 패턴은 Triplet Sum to Zero와 유사합니다. 한 번에 하나의 숫자를 사용하여 배열을 반복하는 유사한 접근 방식을 따를 수 있습니다. 매 단계마다 삼중항과 목표 숫자의 차이를 저장하고, 각 단계에서 지금까지의 최소 목표 차와 비교하여 결국 가장 가까운 합으로 삼중항을 반환할 수 있도록 하겠습니다. 시간 복잡도 배열을 정렬하려면 O(N* logN)이 필요합니다. 전체적으로 threeSumClosest()는 O(N * logN + N^2)를 취하며, 이는 점근적으로 O(N^2)와 동일합니다. 공
쉬운 접근 방식은 4개의 중첩 루프를 만들고 4개 요소의 합계가 0인지 여부를 하나씩 확인할 수 있다는 것입니다. 네 요소의 합이 0이면 요소를 인쇄합니다. 시간 복잡성 - O(n4 ) 공간 복잡성 - O(1) 정렬되지 않은 집합 데이터 구조를 사용하여 배열의 각 값을 저장할 수 있습니다. Set은 O(1) 시간에 요소를 검색하는 이점을 제공합니다. 따라서 배열의 각 쌍에 대해 집합에 존재할 수 있는 합계의 음수를 찾습니다. 그러한 요소가 발견되면 정수 쌍과 그 합계의 음수 값이 될 3중항을 인쇄할 수 있습니다. 시간 복잡성
Two Pointers 패턴이며 4중 Sum to Zero와 유사합니다. 한 번에 하나의 숫자를 사용하여 배열을 반복하는 유사한 접근 방식을 따를 수 있습니다. 매 단계마다 quadrulet과 target number의 차이를 저장하고, 각 단계에서 지금까지의 최소 target 차이와 비교하여 결국 가장 가까운 합으로 triplet을 반환할 수 있습니다. 시간 복잡도 배열을 정렬하려면 O(N* logN)이 필요합니다. 전체 fourSumClosest()는 O(N * logN + N^3)을 취하며 이는 점근적으로 O(N^3)과
파스칼의 삼각형은 삼각형 모양의 숫자 패턴입니다. Pascal의 삼각형은 조합을 계산하는 데 도움이 되는 기능을 포함하여 수학 및 통계에 많은 응용 프로그램을 가지고 있습니다. 삼각형의 각 숫자는 위에 있는 두 숫자의 합입니다. 예를 들어, 행 4 - 위 행의 3과 3의 합입니다. 모든 행의 맨 처음과 맨 마지막 숫자는 항상 1이 됩니다. 시간 복잡도 - O(N) 공간 복잡성 - O(N) 예 public class Arrays{ public List<List<int>> GeneratePa