집 >백엔드 개발 >C#.Net 튜토리얼 >C# 목록을 사용하는 방법
컬렉션은 OOP에서 중요한 개념이며, C#에서 컬렉션에 대한 포괄적인 지원은 언어의 본질 중 하나입니다.
일반 컬렉션을 사용하는 이유는 무엇인가요?
C# 2.0 이전에는 컬렉션을 구현하는 두 가지 주요 방법이 있었습니다.
a. ArrayList
를 사용하여 개체를 ArrayList에 직접 넣을 수 있지만 그 이유는 다음과 같습니다. 항목은 Object 유형이므로 사용할 때마다 지루한 유형 변환을 수행해야 합니다.
b. 사용자 정의 컬렉션 클래스 사용
일반적인 접근 방식은 CollectionBase 추상 클래스에서 사용자 정의 클래스를 상속하고 IList 개체를 캡슐화하여 강력한 형식의 컬렉션을 구현하는 것입니다. 이 방법을 사용하려면 각 컬렉션 유형에 해당하는 사용자 정의 클래스를 작성해야 하므로 많은 작업량이 필요합니다. 일반 컬렉션의 출현으로 위의 문제가 더 잘 해결되었습니다. 지정된 유형의 컬렉션을 만드는 데 코드 한 줄만 있으면 됩니다.
제네릭이란 무엇입니까?
제네릭은 일련의 유사한 문제를 해결하는 데 주로 사용되는 C# 2.0의 새로운 요소(C++에서는 템플릿이라고 함)입니다. 이 메커니즘을 사용하면 클래스 이름을 매개변수로 일반 유형에 전달하고 해당 객체를 생성할 수 있습니다. 제네릭(클래스, 인터페이스, 메서드, 대리자 등 포함)을 템플릿으로 생각하는 것이 더 나을 수 있습니다. 템플릿의 변형 부분은 매개 변수로 전달된 클래스 이름으로 대체되어 새로운 유형 정의를 얻습니다. 제네릭은 상대적으로 큰 주제이므로 여기에서는 자세히 분석하지 않습니다. 관심 있는 사람은 관련 정보를 참조할 수 있습니다.
일반 컬렉션을 만드는 방법은 무엇입니까?
주로 System.Collections.Generic 네임스페이스 아래의 List
Person 클래스를 다음과 같이 정의합니다.
보시다시피 일반 컬렉션은 컬렉션 구현 코드를 크게 단순화하여 지정된 유형의 컬렉션을 쉽게 생성할 수 있습니다. 그뿐만 아니라 일반 컬렉션은 더 강력한 기능도 제공합니다. 정렬 및 검색을 살펴보겠습니다.
List
"T"는 사용되는 유형이며 문자열, int, 또는 사용자 정의 유형입니다. 아래에서 구체적인 예를 살펴보겠습니다.
class Person
{
private string _name; //이름
private int _age;
//Person 객체 생성
public Person(string Name, int Age)
{
this._name= Name;
this._age = 나이;
}
//이름
public string Name
{
get { return _name; }
}
//Age
public int Age
{
get { return _age }
}
}
//Person 객체 생성
Person p1 = new Person("Zhang San", 30);
Person p2 = new Person("lee思", 20);
Person p3 = new Person("王五", 50);
//Person 유형의 객체 컬렉션 생성
List
//Person 객체를 컬렉션에 넣습니다
persons.Add(p1);
people.Add(p2);
persons.Add(p3);
//두 번째 사람의 이름을 출력
Console.Write(persons[1]. 이름);
일반 컬렉션 정렬
정렬은 비교를 기반으로 합니다. 예를 들어, 두 개의 숫자 1과 2가 있습니다. 이를 정렬하려면 먼저 두 숫자를 비교하고 비교 결과에 따라 정렬해야 합니다. 개체를 비교하려는 경우 상황은 좀 더 복잡합니다. 예를 들어 Person 개체를 비교하는 경우 이름이나 나이별로 비교할 수 있으므로 비교 규칙을 결정해야 합니다. 객체에는 여러 비교 규칙이 있을 수 있지만 객체를 정의하는 클래스에 배치되는 기본 규칙은 하나만 있을 수 있습니다. 기본 비교 규칙은 IComparable
class Person: IComparable
{
//연령별 비교
public int CompareTo(Person p )
{
return this.Age - p.Age;
}
}
CompareTo 메서드의 매개 변수는 다음과 같습니다. 동일한 유형의 다른 객체와 비교하여 반환 값은 int 유형입니다. 반환 값이 0보다 크면 첫 번째 객체가 두 번째 객체보다 크다는 의미입니다. , 이는 첫 번째 개체가 두 번째 개체보다 작다는 것을 의미합니다. 0을 반환하면 두 개체가 동일합니다.
기본 비교 규칙을 정의한 후 아래와 같이 매개 변수 없이 Sort 메서드를 통해 컬렉션을 정렬할 수 있습니다.
//기본 규칙에 따라 컬렉션 정렬
사람.정렬();
//소유자 이름 출력
foreach(Person p 명)
{
Console.WriteLine(p.Name) //출력 순서는 " Li Si", "Zhang San", "Wang Wu"
}
실제 사용에서는 다양한 규칙에 따라 집합을 정렬해야 하는 경우가 많으며, 이로 인해 다른 항목을 정의해야 합니다. 비교 규칙은 IComparer
class NameComparer: IComparer
{
//스토리지 정렬기 인스턴스
public static NameComparer Default = new NameComparer();
//이름으로 비교
public int Compare(Person p1, 사람 p2)
{
return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name);
}
}
Compare 메서드의 매개 변수는 비교할 동일한 유형의 두 개체이며 반환 값은 int 유형이며 반환 값 처리 규칙은 CompareTo 메서드와 동일합니다. 그 중 Comparer.Default는 동일한 유형의 두 개체를 비교하기 위해 내장된 Comparer 개체를 반환합니다.
다음으로 새로 정의된 비교자를 사용하여 컬렉션을 정렬합니다.
위임을 통해 컬렉션을 정렬할 수도 있습니다. 먼저 위임이 매장 비교 규칙을 호출하는 방법을 정의해야 합니다. 정적 메소드를 사용할 수 있습니다. 다음 코드를 살펴보십시오. 그런 다음 내장된 일반 대리자를 통해 컬렉션을 정렬합니다. System.Comparison
후자의 두 메서드는 지정된 규칙에 따라 컬렉션을 정렬할 수 있지만, 작성자 위임 방법을 선호한다면 클래스에 다양한 비교 규칙을 넣은 다음 유연하게 호출하는 것을 고려해 볼 수 있습니다.
//이름별로 컬렉션 정렬
persons.Sort(NameComparer.Default);
//모든 사람의 이름 출력
foreach(Person p in 명)
{
Console.WriteLine(p.Name); //출력 순서는 "lee思", "王五", "张三"
}class PersonComparison
{
//이름별 비교
public static int Name(Person p1, Person p2)
{
Return system.Collections.comparer.Default.compare (p1.name, p2.name);}
}>
메소드의 매개변수를 비교해야 합니다. 동일한 유형인 경우 반환 값은 int 유형이며 반환 값 처리 규칙은 CompareTo 메서드와 동일합니다.
System.Comparison
persons.Sort(NameComparison);
//모두 출력 사람 이름
foreach(Person p 명)
{
Console.WriteLine(p.Name); //출력 순서는 "lee思", "王五" ","Zhang San"
}
보시다시피 후자의 두 가지 방법은 지정된 규칙에 따라 컬렉션을 정렬할 수 있지만 작성자는 위임 방법을 선호합니다. 각각의 비교 규칙을 클래스에 넣은 다음 유연하게 호출하는 것을 고려할 수 있습니다.
일반 컬렉션 검색
검색은 컬렉션에서 특정 조건을 충족하는 항목을 찾는 것입니다. 필요에 따라 여러 검색 조건을 정의하고 호출할 수 있습니다. 먼저 검색 조건을 다음과 같이 정의합니다.
class PersonPredicate
{
//중년(40세 이상) 찾기
public static bool MidAge(Person p)
{
if (p.Age >= 40)
return true;
else
return false; 항목은 true를 반환하고 그렇지 않으면 false를 반환합니다.
System.Predicate
List
//중년의 이름을 모두 출력
foreach (Person p in MidAgePersons)
{
Console.WriteLine(p.Name) // 출력 "Wang Wu"
} 그런 다음 내장된 일반 대리자 System.Predicate
일반 컬렉션의 확장
컬렉션에 있는 모든 사람의 이름을 쉼표로 구분하여 얻으려면 어떻게 해야 합니까?
단일 클래스가 제공할 수 있는 기능이 제한되어 있다는 점을 고려하면 List
//Persons 컬렉션 클래스 정의
class Persons: List
{
//모두 가져오기 컬렉션의 항목 Person's name
public string GetAllNames()
{
if (this.Count == 0)
return "";
문자열 값 = "";
Foreach(P인)
{
Val + = p.Name + ","
}
return val.Substring(0, val.Length - 1); >
Persons PersonCol = new Persons();PersonCol.Add(p1) ;PersonCol.Add(p2);PersonCol.Add(p3) ;//모든 사람의 이름 출력Console.Write(PersonCol. GetAllNames()); //"Zhang San, Li Si, Wang Wu" 출력 목록 메서드 및 속성 메서드 또는 속성 함수 용량은 요소 수를 가져오거나 설정하는 데 사용됩니다. 목록은 수용할 수 있습니다. 이 값은 수량이 용량을 초과하면 자동으로 증가합니다. 이 값을 설정하여 용량을 줄이거나, trin() 메서드를 호출하여 실제 요소 수에 맞게 용량을 줄일 수 있습니다. 배열의 현재 요소 수를 가져오는 데 사용되는 Count 속성 Item() 인덱스를 지정하여 요소를 가져오거나 설정합니다. List 클래스의 경우 인덱서입니다. List에 객체를 추가하는 Add() 공용 메서드List 끝에 ICollection 인터페이스를 구현하는 여러 요소를 추가하는 AddRange() 공용 메서드 BinarySearch( ) 정렬된 목록에서 지정된 요소를 찾기 위해 이진 검색을 사용하는 데 사용되는 오버로드된 공용 메서드입니다. Clear( ) 목록의 모든 요소를 제거합니다. Contains( ) 요소 테스트 목록에 있습니다CopyTo() 오버로드된 공개 메소드, 목록을 1차원 배열로 복사Exists() 요소가 목록에 있는지 테스트 Find() 목록에서 일치하는 첫 번째 요소를 찾아 반환합니다FindAll() 목록에서 일치하는 모든 요소를 찾아 반환합니다GetEnumerator() 오버로드된 공용 메서드, 목록 반복을 위한 열거자를 반환합니다. Getrange() 지정된 범위의 요소를 새 목록에 복사IndexOf() 일치하는 각 요소를 찾아 반환하는 오버로드된 공용 메서드 IndexInsert() 삽입 요소를 목록에 추가InsertRange() 목록에 요소 그룹 삽입LastIndexOf() 오버로드된 공개 메서드, 검색하고 마지막으로 일치하는 요소의 인덱스를 반환합니다 Remove( )는 지정된 요소와 일치하는 첫 번째 요소를 제거합니다 RemoveAt( )는 지정된 인덱스를 가진 요소를 제거합니다 RemoveRange( ) 지정된 범위의 요소를 제거합니다Reverse ( ) List의 요소 순서를 뒤집습니다Sort( ) List의 요소 정렬ToArray( ) List의 요소를 새 배열로 복사합니다 trimToSize( ) 용량을 목록의 실제 요소 수로 설정 요약: 이 기사에서는 C# 사용을 소개하는 데 중점을 둡니다. 2.0의 Generics는 컬렉션을 구현하고 컬렉션을 확장하는 데 사용됩니다. 함수를 적절하게 사용하면 반복적인 작업을 많이 줄이고 개발 효율성을 크게 높일 수 있습니다. 실제로 컬렉션은 제네릭의 일반적인 응용 프로그램일 뿐입니다. 제네릭에 대해 더 알고 싶다면 다른 관련 정보를 확인하세요. 이 글이 여러분에게 도움이 되었으면 좋겠습니다 C# 목록 사용법과 관련된 더 많은 글은 PHP 중국어를 참고해주세요 웹사이트!