해시 세트가 있지만 C#에 설정되지 않은 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1023697

  •  06-07-2019
  •  | 
  •  

문제

오래된 질문

내 이해는 C#은 어떤 의미에서 HashSet 그리고 set 유형. 나는 무엇을 이해한다 HashSet 이다. 그러나 왜 set 별도의 단어입니까? 모든 세트가 아닌 이유는 무엇입니까? HashSet<Object>?

새로운 질문

C#에 일반적인 이유가없는 이유는 무엇입니까? Set 유형, 비슷합니다 Dictionary 유형? 내 관점에서 볼 때 표준 조회/추가/삭제 성능이있는 세트를 원합니다. 해시 나 다른 무언가로 실현되었는지 여부는 크게 신경 쓰지 않을 것입니다. 그래서 실제로 구현 될 세트 클래스를 만들지 않겠습니까? HashSet 이 버전의 C#에서 미래 버전에서는 다소 다른가요?

또는 적어도 인터페이스가 아닌 이유는 무엇입니까? ISet?

대답

아래에 대답 한 모든 분들께 감사드립니다. ICollection 당신이 기대하는 많은 것을 구현합니다 ISet. 그래도 내 관점에서 ICollection 구현 IEnumerable 세트를 열거 할 필요는 없지만 --- 예 : 1과 2 사이의 실수 세트 (더 많은 세트는 동적으로 세트를 생성 할 수 있음). 나는 이것이 '정상적인 프로그래머'가 거의 셀 수없는 세트가 필요하지 않기 때문에 사소한 성만에 동의합니다.

좋아, 내가 얻는 것 같아요. HashSet 절대적으로 부름을 받았습니다 Set 그러나 단어 Set 어떤 의미에서 예약되어 있습니다. 보다 구체적으로, .NET Architecture의 제작자는 다른 언어에 대한 일관된 세트 (sic!) 세트를 원했습니다. 이는 표준 클래스의 모든 이름이 .NET 언어의 키워드와 일치해서는 안된다는 것을 의미합니다. 단어 Set, 그러나 VB.NET에는 실제로 대소 문자를 사용하지 않기 때문에 불행히도 기동의 여지가 없습니다.

미스터리 해결 :)

발문

Alex Y.의 새로운 답변은 MSDN 페이지 다가오는 .NET 4.0 인터페이스를 설명합니다 ISet 내가 생각했던 것처럼 거의 행동하는 것은 HashedSet. 행복한 결말.

도움이 되었습니까?

해결책

(당신의 원래 질문에 대한 원래 질문 set 답변되었습니다. IIRC, "세트"는 영어에서 가장 다른 의미를 가진 단어입니다. 분명히 이것은 컴퓨팅에도 영향을 미칩니다.)

나는 괜찮다고 생각합니다 HashSet<T> 그 이름으로, 그러나 나는 확실히 환영합니다 ISet<T> 상호 작용. 을 고려하면 HashSet<T> .NET 3.5에만 도착했습니다. 특히 Java와 동일합니다 LinkedHashSet, 삽입 순서를 유지하는 경우 경우에 따라 유용합니다.

공정하게 ICollection<T> 인터페이스는 실제로 원하는 대부분의 것을 다룹니다 ISet<T>, 아마도 필요하지 않을 수도 있습니다. 그러나 세트의 핵심 목적 (주로 격리에 관한 것이며 요소를 반복 할 수있는 것에 대해서만)은 컬렉션과 매우 같지 않다고 주장 할 수 있습니다. 까다 롭습니다. 실제로, 진정으로 수학적 세트는 반복적이거나 계산되지 않을 수 있습니다. 예를 들어, "1과 2 사이의 실수 세트"를 가질 수 있습니다. 임의의 차량 숫자 유형이 있다면, 수는 무한하고 반복되는 것은 의미가 없습니다.

마찬가지로 세트에 "추가"라는 아이디어가 항상 의미가있는 것은 아닙니다. 컬렉션의 이름을 지정할 때 변이성은 까다로운 사업입니다.

편집 : 좋아, 댓글에 응답 : 키워드 set Visual Basic과 관련된 유산은 아닙니다. 그것은 작전입니다 세트 재산의 가치, vs get 어느 검색합니다 작전. 이것은 세트의 아이디어와 관련이 없습니다.

대신 키워드가 실제로 있다고 상상해보십시오 fetch 그리고 assign, 예를 들어

// Not real code!
public int Foo
{
    fetch
    {
        return fooField;
    } 
    assign
    {
        fooField = value;
    } 
}

목적이 명확합니까? 이제 진짜 C#의 동등한 것은 단지입니다

public int Foo
{
    get
    {
        return fooField;
    } 
    set
    {
        fooField = value;
    } 
}

그래서 당신이 쓰면 :

x = y.Foo;

그것은 그것을 사용할 것입니다 get 재산의 일부. 당신이 쓰면 :

y.Foo = x;

그것은 그것을 사용할 것입니다 set 부분.

더 명확합니까?

다른 팁

세트가 없습니다<T>. 이것 BCL 팀 블로그 게시물 해시를 이름에 포함시키는 것에 대한 전적으로 결정적인 토론을 포함하여 해시 세트에 대한 많은 세부 사항이 있습니다. BCL 팀의 모든 사람이 Hashset이라는 이름을 사용하기로 결정한 것은 아닙니다.<T>.

이에 대한 유일한 이유는 .NET 3.5에서 이상적으로이를 구현할 자원이 부족한 것 같습니다.

.NET 4.0에 포함됩니다 ISET, 새로운 구현뿐만 아니라 해시 세트 - SINTEDSET. 제공된 MSDN 라이브러리에 대한 제공된 링크를 확인하십시오. 이미 .NET 4.0 Beta1에서 사용할 수 있습니다.

set 버전 1.0 이후에 있었던 C# 언어 키워드입니다. IS는 부동산의 부가가치 부분을 정의하는 데 사용됩니다 (및 get 속성의 가치 읽기 부분을 구현하는 데 사용됩니다). 이 맥락에서 값을 설정하는 것처럼 '세트'라는 단어를 동사로 이해해야합니다.

HashSet<T> 세트의 수학적 개념의 특별한 이판입니다. .NET 3.5에서 처음 소개되었습니다. BCL 팀 의이 블로그 게시물은 그 배후의 추론에 대해 더 많이 설명하고 그 이름이 왜 HashSet<T> 그리고 단지 Set<T>: http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing-hashset-t-kim-hamilton.aspx.

의 경우 HashSet<T> '세트'라는 단어를 명사로 이해해야합니다.

세트는 vb.net의 예약 키워드입니다 (C#에서 설정하는 것과 같습니다). vb.net은 키워드와 동일한 이름의 클래스/메소드 등을 사용할 수 있지만 사각형 브래킷 사이에 작성해야합니다.

Imports Wintellect.PowerCollections 'PowerCollections contains a class called Set'
Public Class Test
    Private _myValue As Integer  

    Public Property MyValue() As Integer
        Get
            Return _myValue
        End Get
        Set ' Set as keyword'
            _myValue = value
        End Set
    End Property

    Public Function X As [Set](Of Integer)
        Dim a As New [Set](Of Integer) ' Set as class'
        Return a
    End Function

End Class

아, 지금 당신의 질문을 이해합니다
100%의 필요성을 볼 수 있는지 확실하지 않습니다. ISet<T>.
질문이 어떤 세트에 대한 필수 행동으로 보는 것 같아요?
추가, 제거, 포함 등 ICollection<T> 이미 인터페이스를 제공합니다.
Union, Intersect 등과 같은 운영이 설정되어 있다면 계약 스타일 집행으로 추상화하기에 충분히 일반적인 것으로 생각됩니까?

나는 이것에 대한 정답을 모른다고 말해야한다. 나는 그것이 논쟁의 여지가 있다고 생각한다. 그리고 BCL 팀이 미래 버전에 이와 같은 것을 넣을 수 있다고 생각하지만, 그것은 그들에게 달려있다. 나는 개인적으로 그것을 거대한 기능성으로 보지 않습니다.

원본 게시물

BCL에는 세트 컬렉션이 전혀 없습니다. 적어도 내가 아는 한 멀지 않습니다.
몇 개의 제 3자가 IESI. 수집
HashSet<T> .NET 3.5에 도입되어 중복이없는 컬렉션을 원하는 빠른 세트 컬렉션을 만듭니다. 또한 Union 및 Join과 같은 일반적인 세트 작업이 있습니다. 체크 아웃 이 링크 Hashset의 BCL 팀에서

당신은 일반적으로 이전에 사용해야했던 곳에 그것을 사용할 것입니다. List<T> 추가 할 때 중복을 확인하십시오.
a에 항목 추가 HashSet<T> 또한 가능합니다 상당히 빠릅니다 목록보다

몇 가지 자세한 내용 :
Hashset의 또 다른 좋은 특징은 중복을 시도하고 추가하면 예외를 던지지 않는다는 것입니다. 중복 항목을 추가하지 않아 많은 시도를 저장해야합니다.

나는 없다고 확신합니다 Set<T> 적어도 .NET 3.5에서 BCL에서 클래스 (.NET 4.0이 아님). 어쨌든 그러한 수업의 필요성은 무엇입니까?

HashSet<T> 그 자체는 해시 코드를 사용하는 일반적인 세트 데이터 구조 일뿐입니다. GetHashCode 객체의 방법) 요소를 비교합니다. 이것은 단순히 세트 유형을 구현하는 효율적인 방법입니다. (평등을 점검하는 다른 방법은 성능이 낮을 것입니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top