문제

나는 때때로 C# 3.0에서 튜플의 개념을 시뮬레이션하는 방법을 찾고 있습니다. 시간이 지남에 따라 나는 다양한 "가난한 사람의"구현을 가졌습니다. 여기에 몇 가지가 있습니다.

기본 객체 배열:

object[] poorTuple = new object[]{foo,bar,baz}; // basic object array

더 강력하게 입력했습니다, 호 호 호...

KeyValuePair<TypeA, KeyValuePair<TypeB, TypeC>> poorTuple;

클래스 구현 이는 유형 추론을 사용할 수 있습니다 (들어 올렸습니다 현실 세계를위한 기능적 프로그래밍)

public static class Tuple{
  public static Tuple<T1, T2> Create<T1 foo, T2 bar>{
    return new Tuple<T1, T2>(foo, bar);
  }
}
// later: 
var data = Tuple.Create("foo", 42);

질문:

  1. C# 3.0에서 가난한 사람의 튜플을 갖는 다른 방법 (또는 데이터 구조가없는 선택 언어).

  2. 이것은 베스트 C# 3.0에서 튜플을 얻는 방법 - 라이브러리 추천이있는 사람이 있으면 환영합니다.

  3. 어떤 시점에서 (예, 일반화) 목록이나 튜플과 같은 것이 아니라 특정 유형을 만드는 것이 합리적입니까? (엄지 규칙을 찾고)

도움이 되었습니까?

해결책

유용한 이름을 제외하고 튜플과 유사하게 작동하는 익명 유형을 만들 수 있습니다.

var itemsWithChildCounts 
    = myObjects.Select(x => new { Name = x.Name, Count = x.Children.Count() });

다른 팁

다음은 Bill Wagner 's에서 가져온 일반 튜플 코드입니다. 기사 2007 년 4 월 판에서 Visual Studio Magazine.

public struct Tuple<T1, T2> : IEquatable<Tuple<T1, T2>>
{
    private readonly T1 first;
    public T1 First
    {
        get { return first; }
    }

    private readonly T2 second;
    public T2 Second
    {
        get { return second; }
    } 

    public Tuple(T1 f, T2 s)
    {
        first = f;
        second = s;
    }

    #region IEquatable<Tuple<T1,T2>> Members
    public bool Equals(Tuple<T1, T2> other)
    {
        return first.Equals(other.first) && 
            second.Equals(other.second);
    }

    public override bool Equals(object obj)
    {
        if (obj is Tuple<T1, T2>)
            return this.Equals((Tuple<T1, T2>)obj);
        else
            return false;
    }

    public override int GetHashCode()
    {
        return first.GetHashCode() ˆ second.GetHashCode();
    }
    #endregion
}

1-2 : 나는 자신의 튜플 클래스를 구현하는 것을 선호합니다. 당신이 훔친 구현은 괜찮은 것입니다. 잘 작동해야합니다.

3 : 내 경험 규칙은 다음과 같습니다.이 기능을 여러 가지 방법으로 재사용하자마자 (동일한 유형이 동일한 의미를 갖는) 공개 API에서 사용하면 구현해야 할 때라고 생각합니다. 특정 유형을 가진 "실제"클래스.

  1. "클래스 구현"메소드는 얻을 수있는만큼 좋습니다 (어쨌든 .NET의 다음 버전에 있어야합니다).
  2. 전혀 모른다. 나는 그들을 지금 내 자신의 개인 수업 도서관에 보관한다.
  3. 나는 그들이 대중에게 노출 되 자마자 적절한 수업을 만드는 것을 고려할 것입니다 (즉, 더 이상 내부 수업의 관련 값을 저장하는 데 사용되지 않을 때).

당신이 의견을 요청했기 때문에, 내 것은 항상 유형을 만드는 것입니다. 나는 그 이유를 알 수 없습니다.

종종 유형이 실제로 필요하다는 것을 알 수 없습니다 (주요 용도는 컬렉션에 두 항목을 저장하거나 메소드 호출에서 두 항목을 반환하는 것입니다. 두 경우 모두 항목과 밀접하게 관련되지 않은 경우 두 경우 모두가 있습니다. 아마 뭔가 잘못하고있을 것입니다).

프로그램에 새로운 값을 도입하는 것이 합리적 일 때 새 유형을 만드는 것이 좋다고 생각합니다. 예를 들어, 복잡한 계산기를 작성하는 경우 복소수 유형을 만듭니다. 실제로 몇 가지 변수를 잠시 "접착"하고 싶다면 튜플이 더 나은 선택 일 것입니다. 콘솔에서 두 개의 숫자를 모으는 간단한 기능이 있다고 가정 해 봅시다. 당신은 다음과 같은 일을 할 수 있습니다.

static void GetNumbers(out int x, out int y) { ... }
...
int x, y;
GetNumbers(out x, out y);

"getter"기능에 반환 값이있을 때 일반적으로 의미가 있다고 생각하지만이 경우 실제로 두 개의 반환 값을 가질 수 없기 때문에 그렇지 않습니다. 나는 가서 Twonumbers라는 새로운 유형을 만들고 그것을 사용할 수 있지만, 이것이 솔루션보다 빠르게 문제가된다고 생각합니다. C#이 튜플이 있으면 다음과 같은 일을 할 수 있습니다.

static (int, int) GetNumbers() { ... }
...
int x, y;
(x, y) = GetNumbers();

이제 정말 흥미로운 질문은 다음과 같습니다. C#이 기능이 없지만 라이브러리로 직접 구현할 수 있습니까? 당신이 제안한 코드는 시작이지만 두 번째 예제에서 수행 한 것처럼 할당 할 수는 없습니다. C#에 대해 잘 모르겠지만 C ++ 에서이 사실에 가까워 질 수 있습니다. 반환 값이 참조 유형 일 때 함수 호출은 할당 연산자에게 왼쪽 피연산자가 될 수 있습니다.. 다음을 고려하세요:

// this class is implemented much like yours only with C++
template<typename T1, typename T2> class tuple { ... }
...
template<typename T1, typename T2> tuple<T1, T2>& tie(T1 a, T2 b) { ... }
...
template<typename T1, typename T2> tuple<T1, T2> get_numbers() { ... }
...
int x, y;
tie(x, y) = get_numbers();

나는 그것이 꽤 가까이 있다고 말하고 싶습니다 ... 대신 (x, y) = 우리는 가지고 있습니다 tie(x, y) =. 구현 세부 정보에 관심이 있으시면 TR1 라이브러리를 참조하여 다음에 대해 처음 배운 것입니다.

http://www.boost.org/doc/libs/1_41_0/libs/tuple/doc/tuple_users_guide.html#tiers

그래서이 모든 것을 C# 3.0으로 되돌려 놓기 위해 ... 우리는 당신이 보여준대로 일반 튜플 클래스를 만들 수 있지만, c#의 튜플을 "포장을 풀"하는 넥타이와 같은 함수를 만들 수 있습니까? 나는 그것을 시도하지 않았고, 재미있게 들린다. 그런 것이 없으면 C# 튜플 라이브러리가 내 코드를 통해 확산되도록 꺼려 할 것입니다.

나는 짧은 글쓰기를 위해 많은 학대를 받기 때문에 C#의 유형 추론을 좋아하지 않습니다. 물론 그것은 매우 멋진 기능이지만 사람들은이 경우와 같이 IMHO를 남용합니다.

이 경우 유형에 대한 혼란을 피하기 위해 유형을 명시 적으로 지정합니다 (즉, 아마도 42는 길거나 바이트 또는 짧은 일입니다).

따라서 간단한 튜플 클래스를 가지고 있지 않아 몇 줄만 구현할 수 있습니다. 게으른 경우 튜플 클래스에 대한 확장 방법을 쓸 수도 있습니다. 이것은 삶을 더 쉽고 깨끗하게 만듭니다.

당신이 제시 한 일반적인 것 대신 "팬시"튜플 클래스를 갖는 요점을 보지 마십시오 (유형 추론 제외).

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