質問

.Net 3.5はタプルをサポートしていません。残念ですが、.netの将来のバージョンがタプルをサポートするかどうかはわかりませんか?

役に立ちましたか?

解決

MSDNマガジンの次の記事を読みました:タプルの構築

抜粋:

  

Microsoftの今後の4.0リリース   .NET Frameworkは新しいタイプを導入します   System.Tupleと呼ばれます。 System.Tupleは   の固定サイズのコレクション   不均一に型付けされたデータ。   <!> nbsp;   <!> nbsp;

<!> nbsp;

  

配列のように、タプルには固定があります   変更後は変更できないサイズ   作成されました。配列とは異なり、それぞれ   タプルの要素は異なる場合があります   タイプ、およびタプルは保証することができます   各要素の厳密な型指定。

<!> nbsp;

  

すでに1つの例があります   マイクロソフトの周りに浮かぶタプル   .NET Framework、   System.Collections.Generic名前空間:   KeyValuePair。 KeyValuePairは同じものと考えることができますが   タプルとして、彼らは両方であるため   2つのことを保持するタイプ、   KeyValuePairは   タプルは関係を呼び起こすため   格納する2つの値の間(および   それをサポートするので、正当な理由で   辞書クラス)。

     

さらに、タプルは任意に指定できます   サイズ、ただしKeyValuePairは   2つのこと:キーと値。


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);

静的なTupleクラスにいくつかのファクトリメソッドも追加しました。これにより、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...
}

= "http://rabdullin.com/journal/2008/9/30/に適切な(迅速ではない) C#タプル実装があります。 using-tuples-in-c-functions-and-dictionaries.html "rel =" nofollow noreferrer "> Lokad共有ライブラリ(もちろんオープンソース)には、次の必須機能が含まれます。

  • 2-5の不変タプルの実装
  • 適切なDebuggerDisplayAttribute
  • 適切なハッシュと同等性のチェック
  • 提供されたパラメーター(ジェネリックはコンパイラーによって推論されます)からタプルを生成するためのヘルパーおよびコレクションベースの操作の拡張。
  • 生産テスト済み。

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();

タプルは、コードを使い捨てクラスで散らかしたり、いrefまたはoutパラメーターに頼ったりすることなく、関数呼び出しから複数の値を返すための強力な方法を表します。しかし、私の意見では、作成とアクセスをよりエレガントにするための構文糖がなければ、それらの使用は限られています。

私の意見では、匿名型機能はタプルではなく、非常によく似た構造です。一部の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ライブラリには、他の多くの機能とともに、長年にわたってタプルがありました。 、完全なMIME解析など)。数年前から運用コードで使用しています。

C#は、ジェネリックを介した簡単なタプル(以前の回答どおり)と<!> quot; mumbleタイピング<!> quot;をサポートします。 (多くのC#言語拡張の可能性の1つ)型推論を改善するために、非常に強力になる可能性があります。

価値のあるものとして、F#はタプルをネイティブにサポートし、それで遊んだことがあるので、(匿名の)タプルが多くを追加するかどうかはわかりません...コードの明快さですばやく。

単一のメソッド内のコードには、匿名型があります。メソッドの外に出るコードについては、単純な名前付き型に固執すると思います。もちろん、将来のC#でこれらを不変にする(作業しやすいまま)ことが容易になれば幸いです。

タプルのセットは次のとおりです。これらはPythonスクリプトによって自動生成されるので、おそらく少し船外に行ったのでしょう。

Subversionリポジトリへのリンク

ユーザー名とパスワードが必要です。両方ともゲスト

です

これらは継承に基づいていますが、最初の2つのメンバーの値が同じであっても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);

Will出力:

10, a != 10, a, True

コンピューターサイエンスクラスを正しく覚えている場合、タプルは単なるデータです。

グループ化されたデータが必要な場合-プロパティを含むクラスを作成します。 KeyValuePair のようなものが必要な場合は、そこにあります。

驚いたことに-C#は強く型付けされた言語ですが、タプルはより動的に型付けされた言語に適しています。 C#は時間が経つにつれてより動的に変化してきましたが、それは構文上のシュガーであり、基礎となるデータ型の本当の変化ではありません。

1つのインスタンスに2つの値が必要な場合、KeyValuePair <!> lt; <!> gt;不器用ですが、まともな代替品です。同じことを行い、拡張可能な構造体またはクラスを作成することもできます。

これらをハッシュテーブルまたはディクショナリで使用するには、GetHashCodeおよびEqualsのオーバーロードを提供する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top