문제

.NET 3.5는 튜플을 지원하지 않습니다. 너무 나쁘지만 미래 버전의 .NET이 튜플을 지원할 것인지 확실하지 않습니까?

도움이 되었습니까?

해결책

방금 MSDN 잡지 에서이 기사를 읽었습니다. 건물 튜플

다음은 발췌문입니다.

다가오는 4.0 Microsoft .NET Framework의 릴리스에는 System.Tuple이라는 새로운 유형이 소개됩니다. System.Tuple은 이질적으로 유형 된 데이터의 고정 크기 컬렉션입니다.

 

배열과 마찬가지로 튜플은 생성되면 변경할 수없는 고정 크기를 가지고 있습니다. 배열과 달리 튜플의 각 요소는 다른 유형 일 수 있으며 튜플은 각 요소에 대한 강력한 타이핑을 보장 할 수 있습니다.

 

이미 System.collections.generic 네임 스페이스 : keyvaluepair에 Microsoft .NET 프레임 워크 주위에 떠 다니는 튜플의 예가 이미 있습니다. keyvaluepair는 두 가지를 보유하는 두 가지 유형이기 때문에 튜플과 동일하게 생각할 수 있지만 keyvaluepair는 두 가지 값 사이의 관계를 불러 일으키기 때문에 튜플과 다르게 느낍니다. ).

또한, 튜플은 임의로 크기가 될 수있는 반면, keyvaluepair는 키와 값의 두 가지만 보유합니다.


F#과 같은 일부 언어에는 튜플에 대한 특수 구문이 있지만 모든 언어의 새로운 공통 튜플 유형을 사용할 수 있습니다. 첫 번째 예를 다시 방문하면 유용하지만 튜플이 튜플에 대한 구문이없는 언어로 지나치게 장황 할 수 있음을 알 수 있습니다.

class Program {
    static void Main(string[] args) {
        Tuple<string, int> t = new Tuple<string, int>("Hello", 4);
        PrintStringAndInt(t.Item1, t.Item2);
    }
    static void PrintStringAndInt(string s, int i) {
        Console.WriteLine("{0} {1}", s, i);
    }
}

C# 3.0의 VAR 키워드를 사용하여 튜플 변수의 유형 서명을 제거하여 다소 읽기 쉬운 코드가 가능합니다.

var t = new Tuple<string, int>("Hello", 4);

또한 정적 튜플 클래스에 일부 공장 방법을 추가하여 C#과 같은 유형의 추론을 지원하는 언어로 튜플을 쉽게 만들 수 있습니다.

var t = Tuple.Create("Hello", 4);

다른 팁

#region tuples

    public class Tuple<T>
    {
        public Tuple(T first)
        {
            First = first;
        }

        public T First { get; set; }
    }

    public class Tuple<T, T2> : Tuple<T>
    {
        public Tuple(T first, T2 second)
            : base(first)
        {
            Second = second;
        }

        public T2 Second { get; set; }
    }

    public class Tuple<T, T2, T3> : Tuple<T, T2>
    {
        public Tuple(T first, T2 second, T3 third)
            : base(first, second)
        {
            Third = third;
        }

        public T3 Third { get; set; }
    }

    public class Tuple<T, T2, T3, T4> : Tuple<T, T2, T3>
    {
        public Tuple(T first, T2 second, T3 third, T4 fourth)
            : base(first, second, third)
        {
            Fourth = fourth;
        }

        public T4 Fourth { get; set; }
    }

    #endregion

그리고 선언을 더 예쁘게 만들기 위해 :

public static class Tuple
{
    //Allows Tuple.New(1, "2") instead of new Tuple<int, string>(1, "2")
    public static Tuple<T1, T2> New<T1, T2>(T1 t1, T2 t2)
    {
        return new Tuple<T1, T2>(t1, t2);
    }
    //etc...
}

이있다 적절한 (빠르지 않음) C# 튜플 구현 Lokad 공유 도서관 (물론 오픈 소스) 필요한 기능을 포함하는 (오픈 소스) :

  • 2-5 불변의 튜플 구현
  • 적절한 디버거 디스플레이 트레이프
  • 적절한 해싱 및 평등 점검
  • 제공된 매개 변수로부터 튜플을 생성하기위한 도우미 (제네릭은 컴파일러에 의해 추론 됨) 및 컬렉션 기반 작업을위한 확장자.
  • 생산 테스트.

C# 내에서 튜플 클래스를 구현하거나 F# 클래스를 재사용하는 것은 스토리의 절반에 불과합니다. 이는 상대적으로 쉽게 튜플을 만들 수 있지만 실제로 구문 설탕은 아니기 때문에 F#과 같은 언어로 사용하기에 좋지 않습니다.

예를 들어 F#에서는 패턴 일치를 사용하여 LET 문자 (예 :

let (a, b) = someTupleFunc

불행히도 C#의 F# 클래스를 사용하여 동일한 작업을 수행하는 것은 훨씬 우아합니다.

Tuple<int,int> x = someTupleFunc();
int a = x.get_Item1();
int b = x.get_Item2();

튜플은 코드가 throwaway 클래스와 함께 코드를 쓰지 않고 함수 호출에서 여러 값을 반환하는 강력한 방법을 나타냅니다. 그러나 제 생각에는 구문 설탕이 없으면 창조물을 만들고 더 우아하게 접근 할 수 있으므로 제한적으로 사용됩니다.

제 생각에 익명 유형 기능은 튜플이 아니라 매우 유사한 구성입니다. 일부 LINQ 쿼리의 출력은 튜플처럼 작동하는 익명 유형의 모음입니다.

다음은 타이핑 된 튜플을 생성하는 진술입니다 :-) 즉.

var p1 = new {a = "A", b = 3};

보다: http://www.developer.com/net/csharp/article.php/3589916

C# 7은 기본적으로 튜플을 지원합니다.

var unnamedTuple = ("Peter", 29);
var namedTuple = (Name: "Peter", Age: 29);
(string Name, double Age) typedTuple = ("Peter", 29);

내 오픈 소스 .NET SASA 라이브러리 수년간 튜플이있었습니다 (풀 마임 파싱과 같은 다른 기능과 함께). 나는 몇 년 동안 생산 코드에서 그것을 사용해 왔습니다.

C#은 (이전 답변에 따라) 제네릭을 통해 간단한 튜플을 지원하고, "MUMBLE TYPING"(가능한 많은 C# 언어 향상 중 하나)를 통해 유형의 추론을 개선하기 위해 매우 강력 할 수 있습니다.

그 가치가 무엇인지, F#는 기본적으로 튜플을 지원하고, 그것을 가지고 놀았는지, (익명) 튜플이 많이 추가되는지 확실하지 않습니다 ... 당신이 잃어버린 당신이 잃는 것 매우 코드 선명도에서 빠르게.

단일 방법 내의 코드의 경우 익명 유형이 있습니다. 방법을 벗어나는 코드의 경우 간단한 이름의 유형을 고수 할 것입니다. 물론, 미래의 C#이 불변을 쉽게 만들 수있게한다면 (여전히 작업하기 쉽지만) 행복 할 것입니다.

여기에 내 튜플 세트가 있습니다. 파이썬 스크립트로 자율적으로 자극을 받았으므로 아마도 약간의 배 밖으로 갔을 것입니다.

전복 저장소에 링크

사용자 이름/비밀번호가 필요합니다. 둘 다입니다 손님

그것들은 상속에 기초하지만 Tuple<Int32,String> 비교하지 않습니다 Tuple<Int32,String,Boolean> 두 명의 첫 번째 멤버에 대해 동일한 값을 갖는 경우에도 마찬가지입니다.

또한 gethashcode와 tostring 등을 구현하고 많은 작은 도우미 방법을 구현합니다.

사용의 예 :

Tuple<Int32, String> t1 = new Tuple<Int32, String>(10, "a");
Tuple<Int32, String, Boolean> t2 = new Tuple<Int32, String, Boolean>(10, "a", true);
if (t1.Equals(t2))
    Console.Out.WriteLine(t1 + " == " + t2);
else
    Console.Out.WriteLine(t1 + " != " + t2);

출력 :

10, a != 10, a, True

내 컴퓨터 과학 수업을 기억한다면 튜플은 단지 데이터 일뿐입니다.

그룹화 된 데이터를 원하는 경우 - 속성이 포함 된 클래스를 작성하십시오. 당신과 같은 것이 필요한 경우 keyvaluepair 그리고 거기에 있습니다.

나는 놀랄 것입니다 - C#은 강력한 언어 인 반면, 튜플은보다 역동적으로 타이핑 된 언어에 적합합니다. C#은 시간이 지남에 따라 더 역동적 인 표류를 해왔지만, 이는 기본 데이터 유형의 실제 변화가 아니라 구문 설탕입니다.

한 예에서 두 값을 원한다면 KeyValuePair <>는 서투른 대체품입니다. 또한 똑같은 일을하고 확장 할 수있는 구조물이나 클래스를 만들 수 있습니다.

해시 가능 또는 사전에 유용하게 만들려면 gethashcode 및 동등한 과부하를 제공 할 것입니다.

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