C#에서 값 쌍(삼중 등)을 하나의 값으로 사용하는 가장 좋은 방법은 무엇입니까?

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

문제

즉, 값의 튜플을 갖고 싶습니다.

내 생각에 사용 사례는 다음과 같습니다.

Dictionary<Pair<string, int>, object>

또는

Dictionary<Triple<string, int, int>, object>

페어(Pair)나 트리플(Triple) 같은 내장형이 있나요?아니면 그것을 구현하는 가장 좋은 방법은 무엇입니까?

업데이트 답변에 설명된 몇 가지 범용 튜플 구현이 있지만 사전의 키로 사용되는 튜플의 경우 추가로 해시 코드의 올바른 계산을 확인해야 합니다.이에 대한 추가 정보는 다른 문서에서 확인하세요. 질문.

업데이트 2 나는 또한 어떤 값을 사전의 키로 사용할 때 불변이어야 한다는 점을 상기할 가치가 있다고 생각합니다.

도움이 되었습니까?

해결책

C#에서 튜플 라이브러리를 구현했습니다.방문하다 http://www.adventuresinsoftware.com/generics/ 그리고 "튜플" 링크를 클릭하세요.

다른 팁

내장 클래스

특정 경우에 .net 프레임워크는 이미 활용할 수 있는 튜플과 유사한 클래스를 제공합니다.

쌍과 삼중

일반System.Collections.Generic.KeyValuePair클래스는 임시 쌍 구현으로 사용될 수 있습니다.이것은 일반 사전이 내부적으로 사용하는 클래스입니다.

또는 다음과 같은 조치를 취할 수도 있습니다.System.Collections.DictionaryEntry초보 쌍으로 작용하고 mscorlib에서 이용할 수있는 이점이있는 구조.그러나 아래쪽에는이 구조가 강하게 입력되지 않았다는 것입니다.

페어와 트리플도 다음과 같은 형태로 제공됩니다.시스템.웹.UI.쌍 그리고System.Web.UI.Triplet 클래스.이 수업은 시스템.웹 어셈블리는 Winforms 개발에 완벽하게 적합 할 수 있습니다.그러나 이러한 클래스는 강력하게 입력되지 않았으며 일반적인 정렬 프레임 워크 또는 라이브러리와 같은 일부 시나리오에서는 적합하지 않을 수 있습니다.

고차 튜플

자신의 클래스를 굴리는 것이 부족한 고차 튜플의 경우 간단한 솔루션이 없을 수 있습니다.

다음을 설치한 경우F# 언어, 당신은 FSharp.Core.dll 일반적인 불변 세트를 포함하는Microsoft.Fsharp.Core.Tuple 최대의 수업.그러나 수정되지 않았음에도 불구하고 FSharp.Code.dll재분배 할 수 있습니다. F#은 연구 언어이며 진행중인 작업 이므로이 솔루션은 학업 분야에서만 관심을 가질 수 있습니다.

자신의 클래스를 만들고 싶지 않고 F# 라이브러리를 참조하는 불편한 경우, 값 멤버 자체가 중첩 된 keyvaluepair가되도록 일반적인 keyvaluepair 클래스를 확장하는 데 하나의 멋진 트릭이 구성 될 수 있습니다.

예를 들어, 다음 코드는 트리플을 만들기 위해 keyvaluepair를 활용하는 방법을 보여줍니다.

int id = 33;
string description = "This is a custom solution";
DateTime created = DateTime.Now;

KeyValuePair<int, KeyValuePair<string, DateTime>> triple =
   new KeyValuePair<int, KeyValuePair<string, DateTime>>();
triple.Key = id;
triple.Value.Key = description;
triple.Value.Value = created;

이를 통해 필요에 따라 클래스를 임의의 수준으로 확장할 수 있습니다.

KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string> quadruple =
    new KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>();
KeyValuePair<KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>, string> quintuple =
    new KeyValuePair<KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>, string>();

나만의 롤

다른 경우에는 자신의 튜플 클래스를 굴리는 데 의지해야 할 수도 있습니다. 이는 어렵지 않습니다.

다음과 같은 간단한 구조를 만들 수 있습니다.

struct Pair<T, R>
{
    private T first_;
    private R second_;

    public T First
    {
        get { return first_; }
        set { first_ = value; }
    }

    public R Second
    {
        get { return second_; }
        set { second_ = value; }
    }
}

프레임워크 및 라이브러리

이 문제는 이전에 해결되었으며 범용 프레임 워크가 존재합니다.다음은 그러한 프레임워크 중 하나에 대한 링크입니다.

public struct Pair<T1, T2>
{
    public T1 First;
    public T2 Second;
}

public struct Triple<T1, T2, T3>
{
    public T1 First;
    public T2 Second;
    public T3 Third;
}

2010년으로 빨리 감기면 .NET 4.0은 이제 다음을 지원합니다. 임의의 n으로 구성된 n-튜플.이러한 튜플은 예상대로 구조적 동등성과 비교를 구현합니다.

쌍과 삼중항은 .net의 기존 클래스입니다. msdn을 참조하세요.

세 쌍둥이

나는 최근 viewstate 디코딩을 가지고 놀다가 그것들을 발견했습니다.

나는 보통 값을 포함하는 나만의 구조체를 만듭니다.좀 더 읽기 쉬운 경우가 많습니다. ;)

키값쌍 자신만의 클래스를 만들고 싶지 않다면 확장하기 가장 좋은 클래스입니다.

int id = 33;
string description = "This is a custom solution";
DateTime created = DateTime.Now;

KeyValuePair<int, KeyValuePair<string, DateTime>> triple =
   new KeyValuePair<int, KeyValuePair<string, DateTime>>();
triple.Key = id;
triple.Value.Key = description;
triple.Value.Value = created;

원하는 만큼의 수준으로 확장할 수 있습니다.

KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string, string> quadruple =
   new KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string, string>();

메모:수업 세 쌍둥이 그리고 내부에 존재한다 시스템.웹-dll이므로 ASP.NET 이외의 다른 솔루션에는 적합하지 않습니다.

자신만의 튜플 클래스를 상대적으로 쉽게 만들 수 있습니다. 잠재적으로 지저분해질 수 있는 유일한 것은 동일성과 해시 코드 재정의입니다(사전에서 사용하려는 경우 필수).

.Net 자체의 KeyValuePair<TKey,TValue> 구조체에는 상대적으로 느린 평등 및 해시 코드 방법.

이것이 당신에게 문제가 되지 않는다고 가정하면 코드를 파악하기 어려워지는 문제가 여전히 있습니다.

public Tuple<int, string, int> GetSomething() 
{
    //do stuff to get your multi-value return
}

//then call it:
var retVal = GetSomething();

//problem is what does this mean?
retVal.Item1 / retVal.Item3; 
//what are item 1 and 3?

대부분의 경우 특정 레코드 클래스를 생성하는 것이 더 쉽다는 것을 알았습니다(적어도 C#4가 이 컴파일러를 마술처럼 만들 때까지는).

class CustomRetVal {
    int CurrentIndex { get; set; }
    string Message { get; set; }
    int CurrentTotal { get; set; }
}

var retVal = GetSomething();

//get % progress
retVal.CurrentIndex / retVal.CurrentTotal;

하나의 간단한 해결책은 아직 언급되지 않았습니다.당신은 또한 List<T>.내장되어 있으며 효율적이고 사용하기 쉽습니다.물론 처음에는 약간 이상해 보이지만 특히 더 많은 수의 요소에 대해 완벽하게 작동합니다.

인기 있는 .Net 알고리즘 및 데이터 구조 라이브러리인 NGenerics가 최근 출시되었습니다. 불변 데이터 구조를 세트로 만듭니다.

구현해야 할 첫 번째 불변 항목은 다음과 같습니다. 그리고 튜플 클래스.코드는 테스트로 잘 덮여 있으며 매우 우아합니다.확인하실 수 있습니다 여기.그들은 현재 다른 불변의 대안을 연구하고 있으며 곧 준비될 것입니다.

내장된 기능은 없지만 pair<T,R> 클래스를 만드는 것은 간단합니다.

예, System.Web.UI.Pair 및 System.Web.UI.Triplet(쌍 유형 동작을 위한 오버로드된 생성기가 있음)이 있습니다.

첫 번째 경우에는 일반적으로 다음을 사용합니다.

Dictionary<KeyValuePair<string, int>, object>

이를 위한 내장 클래스가 없습니다.당신이 사용할 수있는 키값쌍 또는 자체 구현을 출시하세요.

System.Collections.Generic.KeyValuePair를 쌍 구현으로 사용할 수 있습니다.

아니면 직접 구현할 수도 있습니다. 어렵지 않습니다.

public class Triple<T, U, V>
{
  public T First {get;set;}
  public U Second {get;set;}
  public V Third {get;set;}
}

물론 언젠가 Triple(string, int, int)가 Triple(int, int, string)과 호환되지 않는 문제에 직면할 수도 있습니다.대신 System.Xml.Linq.XElement를 사용할 수도 있습니다.

F#에는 Tuple<> 형식도 있습니다.FSharp.Core.dll을 참조하면 됩니다.

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