이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 22157|회답: 1

[출처] C# 일반 레인지로버 (턴)

[링크 복사]
게시됨 2014. 11. 11. 오전 8:56:04 | | |
컬렉션은 OOP에서 중요한 개념이며, C#에서 컬렉션을 완벽하게 지원하는 것은 이 언어에서 가장 좋은 점 중 하나입니다.
    왜 일반 세트를 사용하나요?
    C# 2.0 이전에는 컬렉션이 두 가지 주요 방식으로 구현될 수 있었습니다:
    a. ArrayList 사용
    ArrayList에 객체를 직접 넣는 것은 직관적이지만, 컬렉션 내 항목들이 Object 타입이기 때문에 사용할 때마다 번거로운 타입 변환을 해야 합니다.
    b. 커스텀 컬렉션 클래스 사용
    일반적인 관행은 CollectionBase 추상 클래스에서 커스텀 클래스를 상속하여 IList 객체를 캡슐화하여 강력한 타입 컬렉션을 구현하는 것입니다. 이 방법은 각 컬렉션 유형별로 대응하는 커스텀 클래스를 작성해야 하므로 많은 작업이 필요합니다. 제네릭 컬렉션의 등장은 위의 문제들을 잘 해결하며, 지정된 유형의 집합을 생성하는 데 단 한 줄의 코드만으로 사용할 수 있습니다.
    제네릭이 뭐야?
    제네릭은 C# 2.0에서 새로 추가된 요소들로(C++에서는 템플릿이라고 불림) 주로 유사한 문제들을 해결하는 데 사용됩니다. 이 메커니즘은 클래스 이름을 인자로 제네릭 타입에 전달하고 해당 객체가 생성되도록 합니다. 제네릭(클래스, 인터페이스, 메서드, 대의자 등 포함)을 템플릿으로 생각하는 것이 더 나을 수 있으며, 변형 부분을 인자로 전달하는 클래스 이름으로 대체하여 새로운 타입 정의를 만듭니다. 제네릭은 비교적 방대한 주제이며, 여기서 자세히 분석하지 않겠습니다. 관심 있는 분들은 관련 정보를 참고하실 수 있습니다.
    일반 컬렉션을 어떻게 만드나요?
    System.Collections.Generic 네임스페이스 내의 List generic 클래스<T>는 컬렉션을 생성하는 데 사용되며, 문법은 다음과 같습니다:
[mw_shl_code=csharp, 진실] 리스트<T> 리스트 OfT = 새 리스트<T>(); [/mw_shl_code]
"T"는 사용할 타입으로, 문자열, 정수형, 사용자 정의 타입과 같은 단순 타입일 수 있습니다. 구체적인 예를 살펴보겠습니다.

Person 클래스는 다음과 같이 정의됩니다:
[mw_shl_code=csharp, true]계급 사람
{
    사설 스트링 _name; 이름
    사설 정보 _age; 연식

    사람 생성 객체
    공인 (이름 이름, 나이)
    {
        this._name= 이름;
        this._age = 나이;
    }

    이름
    공개 문자열 이름
    {
        get { return _name; }
    }

    연식
    대중 내트 연령
    {
        받아야 { 반환 _age; }
    }
}

//创建Person对象
사람 p1 = 새로운 사람("장산", 30);
인물 p2 = 새로운 인물("리스", 20);
인물 p3 = 새로운 인물("왕우", 50);

//创建类型为Person的对象集合
명단<Person> 인물 = 새 명단<Person>();

//将Person对象放入集合
인물들. Add(p1);
인물들. Add(p2);
인물들. Add(3쪽);

//输出第2个人的姓名
콘솔.Write(persons[1]. 이름); [/mw_shl_code]
보시다시피, 제네릭 컬렉션은 컬렉션의 구현 코드를 크게 단순화하여 지정된 유형의 컬렉션을 쉽게 만들 수 있습니다. 뿐만 아니라, 일반 컬렉션은 더 강력한 기능도 제공합니다. 이제 그 안의 정렬과 검색을 살펴보겠습니다.
    일반 컬렉션의 분류
    분류는 비교에 기반하며, 분류하려면 먼저 비교해야 합니다. 예를 들어, 1과 2라는 두 숫자가 있다면, 먼저 이 두 숫자를 비교하고 비교 결과에 따라 정렬해야 합니다. 객체를 비교하고 싶다면 상황이 좀 더 복잡합니다. 예를 들어, 인물(Person) 객체를 비교할 때는 이름이나 나이로 비교할 수 있는데, 이는 비교 규칙을 결정해야 합니다. 객체는 여러 비교 규칙을 가질 수 있지만, 기본 규칙은 하나만 존재하며, 이 규칙은 객체를 정의하는 클래스에 배치됩니다. 기본 비교 규칙은 IComparable 일반 인터페이스에 속하는 CompareTo 메서드에 정의되어 있습니다<T>. 아래 코드를 확인하세요:
[mw_shl_code=csharp,true]class 사람 :IComparable<Person>
{
    나이별 비교
    public int CompareTo(Person p)
    {
        이거 반납해. 나이 - p.나이;
    }
}[/mw_shl_code]
CompareTo 메서드의 매개변수는 비교할 동일한 유형의 또 다른 객체이며, 반환 값은 int 타입입니다. 반환 값이 0이면 첫 번째 객체가 두 번째 객체보다 크다는 뜻이고, 반환 값이 0보다 작으면 첫 번째 객체가 두 번째 객체보다 작다는 뜻이며, 반환 0이 되면 두 객체는 같습니다.
기본 비교 규칙을 정의한 후, 다음과 같이 매개변수 없이 정렬 메서드를 사용해 컬렉션을 정렬할 수 있습니다:
[mw_shl_code=csharp,true]// 기본 규칙에 따라 컬렉션을 정렬하세요
인물들. Sort();

//输出所有人姓名
foreach (인칭 p의 인칭)
{
    콘솔.WriteLine(p.Name); 출력 순서는 "리스", "장산", "왕우"입니다.
}[/mw_shl_code]
실제로는 다양한 규칙에 따라 컬렉션을 정렬해야 하며, 이는 다른 비교 규칙의 정의를 필요로 하며, 이는 IComparer 일반 인터페이스에 속하는 Compare 메서드에서 정의할 수 있습니다<T>. 다음 코드를 참조하세요:
[mw_shl_code=csharp,true]클래스 이름비교기 : IComparer<Person>
{
    스토리지 시퀀서 인스턴스
    공개 정적 NameComparer default = new NameComparer();

    이름으로 비교하기
    공개 지능 비교(Person p1, Person p2)
    {
        System.Collections.Comparer.Default.Compare(p1. 이름, p2. 이름);
    }
}[/mw_shl_code]
Compare 메서드의 매개변수는 비교할 동일한 유형의 두 객체이며, 반환 값은 int 타입이고, 반환값 처리 규칙은 CompareTo 메서드와 동일합니다. Comparer.Default는 동일한 유형의 두 객체를 비교하기 위한 내장된 Comparer 객체를 반환합니다.
    이 새로 정의된 비교기로 컬렉션을 정렬하는 방법은 다음과 같습니다:
[mw_shl_code=csharp,true]//컬렉션을 이름으로 정렬하기
인물들. Sort(NameComparer.Default);

//输出所有人姓名
foreach (인칭 p의 인칭)
{
    콘솔.WriteLine(p.Name); 출력 순서는 "리스", "왕우", "장산"입니다.
}[/mw_shl_code]
컬렉션을 위임하는 방법으로도 정렬할 수 있습니다. 우선, 대리자가 비교 규칙을 저장할 메서드를 정의하고, 정적 메서드를 사용할 수 있습니다. 아래 코드를 확인하세요:
[mw_shl_code=csharp,true]클래스 인물 비교
{
    이름으로 비교하기
    공개 정적 int 이름(Person p1, Person p2)
    {
        System.Collections.Comparer.Default.Compare(p1. 이름, p2. 이름);
    }
}[/mw_shl_code]
이 메서드의 매개변수는 비교할 동일한 유형의 두 객체이며, 반환 값은 int 타입이고, 반환 값 처리 규칙은 CompareTo 메서드와 동일합니다.그 다음 내장된 일반 대리인 System을 통해 컬렉션을 정렬합니다. 비교<T>:
[mw_shl_code=csharp, 진실] System.Comparison<Person> nameComparison = 새로운 System.Comparison<Person>(PersonComparison.Name);
인물들. 정렬(NameComparison);

//输出所有人姓名
foreach (인칭 p의 인칭)
{
    콘솔.WriteLine(p.Name); 출력 순서는 "리스", "왕우", "장산"입니다.
}[/mw_shl_code]
후자의 두 메서드는 지정된 규칙에 따라 컬렉션을 정렬할 수 있지만, 저자는 위임 방식을 선호하며, 클래스에 다양한 비교 규칙을 넣고 유연하게 호출하는 것도 고려할 수 있습니다.
    일반 컬렉션 검색
    검색은 컬렉션에서 특정 조건을 충족하는 항목을 찾는 것이며, 필요에 따라 여러 검색 조건을 정의하고 호출할 수 있습니다. 먼저, 검색 기준을 다음과 같이 정의하세요:
[mw_shl_code=csharp,참] 클래스 Person 술어
{
    중년층(40대 이상) 찾기
    public static bool MidAge(Person p)
    {
        만약 (p.나이 >= 40)
            진짜로 반환;
        그렇지 않으면
            return false;
    }
}[/mw_shl_code]
위의 검색 기준은 불리언 반환 타입을 가진 정적 메서드에 배치되며, 특정 조건을 충족하는 항목은 참을 반환하고 그렇지 않으면 거짓으로 반환합니다.그 다음 내장된 제네릭 대리자 System.Predicate를 통해 컬렉션을 검색합니다<T>:
[mw_shl_code=csharp, 진실] System.Predicate<Person> MidAgePredicate = 새로운 System.Predicate<Person>(PersonPredicate.MidAge);
중<Person>년 인물 목록 = 인원. FindAll(중세 술어);

//输出所有的中年人姓名
foreach (중년인물의 인칭 p)
{
    콘솔.WriteLine(p.Name); 출품 "왕우"
}[/mw_shl_code]
일반 컬렉션의 확장
    만약 세트에 있는 모든 인물의 이름을 쉼표로 구분하고 싶다면?
    단일 클래스가 제공할 수 있는 기능이 제한적이라는 점을 고려하면, List 클래스를 확장하는 것이 자연스럽습니다<T>. List 클래스도 클래스이기 때문에 상속으로 확장할 수 있습니다. 아래 코드를 확인하세요:
[mw_shl_code=csharp,true]// Persons 컬렉션 클래스 정의
계급 인물 : 목록<Person>
{
    컬렉션에 있는 모든 사람의 이름을 찾아보세요
    공개 문자열 GetAllNames()
    {
        만약 (이것. 카운트 == 0)
            ""로 돌아가기;

        문자열 발 = "";
        foreach (여기서 인칭 p)
        {
            발 += p.Name + ",";
        }

        발 돌려줘. 서브스트링(0, val. 길이 - 1);
    }
}

//创建并填充Persons集合
Persons PersonCol = 새로운 인원();
인사장(1쪽);
PersonCol.Add(p2);
PersonCol.Add(3쪽);

//输出所有人姓名
Console.Write(PersonCol.GetAllNames()); "장산, 리스, 왕우"[/mw_shl_code]
요약:
    이 글은 C# 2.0에서 제네릭을 활용해 컬렉션을 구현하고 컬렉션 기능을 확장하는 방법에 초점을 맞추며, 제네릭 컬렉션의 적절한 사용은 많은 작업 중복을 줄이고 개발 효율성을 크게 향상시킬 수 있습니다. 사실 세트는 제네릭의 일반적인 적용일 뿐이며, 제네릭에 대해 더 알고 싶다면 관련 자료를 참고할 수 있습니다. 이 글이 도움이 되었길 바랍니다 :-)





이전의:C#에는 컬렉션을 위한 여러 종류의 롤업이 있습니다
다음:SOS 게시물, 신이 도와주시길 바라요. 학교 학생 로그인 시스템 비밀번호를 잊어버렸는데, 도움을 받으려면 비밀번호를 어떻게 되찾을 수 있나요? 미리 감사드립니다
게시됨 2014. 11. 24. 오전 11:48:29 |
0 회수 제거
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com