UFO ET IT

HashSet과 List의 차이점은 무엇입니까?

ufoet 2023. 5. 13. 20:12
반응형

HashSet List의 차이점은 무엇입니까?

사이의 차이점이 무엇인지 설명해 주시겠습니까?HashSet<T>그리고.List<T>NET 서?

예를 들어 어떤 경우에 어떤 경우에HashSet<T>에 비해 우선되어야 합니다.List<T>?

목록과 달리 <> ...

  1. 해시 집합은 중복 구성원이 없는 목록입니다.

  2. HashSet은 고유한 항목만 포함하도록 제한되므로 내부 구조가 검색에 최적화되어 있습니다(목록과 비교하여). 상당히 빠릅니다.

  3. HashSet에 추가하면 집합에 이미 있기 때문에 추가에 실패할 경우 부울 false를 반환합니다.

  4. 집합(Union/Intersection/IsSubsetOf 등)에 대해 수학적 집합 연산을 수행할 수 있습니다.

  5. HashSet은 IList만 ICollection을 구현하지 않습니다.

  6. 열거자만 있는 해시 집합에는 인덱스를 사용할 수 없습니다.

해시 집합을 사용하는 주된 이유는 집합 작업을 수행하려는 경우입니다.

지정된 두 세트: hashSet1 및 hashSet2

 //returns a list of distinct items in both sets
 HashSet set3 = set1.Union( set2 );

LINQ를 사용하는 동등한 연산과 비교하여 플라이.그것은 또한 쓰기에 더 깔끔합니다!

좀 더 정확하게 예를 들어 설명해 보겠습니다.

다음 예제와 같이 HashSet을 사용할 수 없습니다.

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
for (int i = 0; i < hashSet1.Count; i++)
    Console.WriteLine(hashSet1[i]);

hashSet1[i]오류가 발생합니다.

[]을(를) 사용한 인덱싱을 'System' 유형의 식을 적용할 수 없습니다.컬렉션.포괄적인.해시 집합'

각 문에 사용할 수 있습니다.

foreach (var item in hashSet1)
    Console.WriteLine(item);

목록에서 이 작업을 수행할 수 있고 항목을 HashSet에 추가하는 동안 해당 항목이 포함되어 있는지 여부를 확인할 수 있는 경우 중복 항목을 HashSet에 추가할 수 있습니다.

HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
if (hashSet1.Add("1"))
   Console.WriteLine("'1' is successfully added to hashSet1!");
else
   Console.WriteLine("'1' could not be added to hashSet1, because it contains '1'");

에는 HashSet과 같은 .IntersectWith,UnionWith,IsProperSubsetOf,ExceptWith,SymmetricExceptWith

IsProperSubsetOf:

HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
HashSet<string> hashSet3 = new HashSet<string>() { "1", "2", "3", "4", "5" };
if (hashSet1.IsProperSubsetOf(hashSet3))
    Console.WriteLine("hashSet3 contains all elements of hashSet1.");
if (!hashSet1.IsProperSubsetOf(hashSet2))
    Console.WriteLine("hashSet2 does not contains all elements of hashSet1.");

UnionWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
hashSet1.UnionWith(hashSet2); //hashSet1 -> 3, 2, 4, 6, 8

IntersectWith:

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" }
hashSet1.IntersectWith(hashSet2);//hashSet1 -> 4, 8

ExceptWith:

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.ExceptWith(hashSet2);//hashSet1 -> 5, 6

SymmetricExceptWith:

 HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
 HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
 hashSet1.SymmetricExceptWith(hashSet2);//hashSet1 -> 4, 5, 6

그런데, 순서는 HashSets에 보존되지 않습니다.이 예제에서는 요소 "2"를 마지막으로 추가했지만 두 번째 순서입니다.

HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
hashSet1.Add("1");    // 3, 4, 8, 1
hashSet1.Remove("4"); // 3, 8, 1
hashSet1.Add("2");    // 3, 2 ,8, 1

A HashSet<T>당신에게 제공하기 위해 고안된 수업입니다.O(1)격납을 검색합니다(즉, 이 컬렉션에 특정 개체가 포함되어 있는지, 답변을 빨리 알려줍니다).

A List<T>당신에게 컬렉션을 제공하기 위해 고안된 클래스입니다.O(1)동적으로 증가할 수 있는 것보다 랜덤 액세스가 더 많습니다(동적 어레이라고 생각).다음에서 격납을 테스트할 수 있습니다.O(n), (이정렬지않경이수수검행할니색을진우은되▁in▁search▁time목▁(다있▁do▁binary니▁a습수▁isunless▁can▁then▁list)O(log n)

예를 들어 어떤 경우에 어떤 경우에HashSet<T>에 대해 우선되어야 합니다.List<T>

테때할트에서 때.O(1).

을 합니다.List<T>원하는 경우:

  • 항목 모음을 특정 순서로 저장합니다.

(의 인덱스를 검색은 (으)ㄹ 수 있습니다.O(1) 데 더 많은 이 걸립니다.O(n)분류되지 않은 수집용입니다.

을 합니다.Hashset<T>원하는 경우:

  • 특정 개체가 컬렉션에 포함되어 있는지 신속하게 확인할 수 있습니다.

Lookup은 는려항목이름알을고있조경는회입니다.O(1)(이것이 '해시' 부분입니다.처럼 순서를 하지 않습니다.List<T>중복 항목을 저장할 수 없습니다(중복 항목을 추가해도 '설정' 부분).

를 의 예Hashset<T>Scrabble 게임에서 재생되는 단어가 영어(또는 다른 언어)에서 유효한 단어인지 확인하고 싶다면,이러한 게임의 온라인 버전의 모든 인스턴스에서 사용할 웹 서비스를 구축하려면 더욱 좋습니다.

A List<T>선수 점수를 추적하기 위한 스코어보드를 만드는 데 좋은 데이터 구조가 될 것입니다.

목록은 순서가 지정된 목록입니다.그렇다.

  • 정수 인덱스로 액세스합니다.
  • 중복 항목을 포함할 수 있음
  • 순서가 예측 가능합니다.

해시 집합은 집합입니다.내용:

  • 중복 항목을 차단할 수 있습니다(추가(T) 참조).
  • 세트 내 품목의 순서를 보장하지 않습니다.
  • 집합에 대해 예상되는 작업(예: 교차 위치, IsPropertySubsetOf, UnionWith)이 있습니다.

목록은 항목을 추가, 삽입 및 제거할 수 있는 배열과 같은 컬렉션에 액세스하려는 경우에 더 적합합니다.순서가 중요하지 않은 항목의 "가방"처럼 컬렉션을 처리하거나 IntersectWith 또는 UnionWith와 같은 작업을 사용하여 다른 세트와 비교하려는 경우 HashSet이 더 나은 선택입니다.

목록이 반드시 고유한 것은 아니지만 해시 집합은 하나입니다.

목록은 배열과 달리 항목을 추가하거나 제거할 수 있는 T 유형의 개체 순서 모음입니다.

저장한 순서대로 구성원을 참조하고 항목 자체가 아닌 위치로 구성원에 액세스하려는 목록을 사용할 수 있습니다.

HashSet은 항목 자체가 키이며 값이며 순서가 보장되지 않는다는 사전과 같습니다.

개체가 컬렉션에 있는지 확인할 해시 집합을 사용합니다.

데이터 기반 개발에서 이러한 데이터 구조를 실제 사용에 적용하기로 결정한 경우 HashSet은 데이터 정리 및 마이그레이션을 위해 데이터 어댑터 소스에 대해 복제를 테스트하는 데 매우 유용합니다.

또한 DataAnnotations 클래스를 사용하는 경우 클래스 속성에 Key 로직을 구현하고 HashSet을 사용하여 자연 인덱스(클러스터 여부와 상관없이)를 효과적으로 제어할 수 있습니다. 이 경우 List 구현이 매우 어렵습니다.

목록을 사용하는 강력한 옵션은 클래스 목록을 MVC View로 DropDownListHelper로 전송하는 것과 같은 View 모델의 여러 미디어에 대한 일반 기능을 구현하는 것이며 WebApi를 통해 JSON 구성체로 전송하는 것도 가능합니다.이 목록은 일반적인 클래스 수집 논리를 허용하며, 단일 뷰 모델을 다른 매체로 계산하는 "인터페이스"와 같은 접근 방식을 유연하게 유지합니다.

언급URL : https://stackoverflow.com/questions/6391738/what-is-the-difference-between-hashsett-and-listt

반응형