2010-11-23 4 views
38

これはおそらく明らかな疑問ですが、クラスを作成せずに複数のパラメータを持つListを作成するにはどうすればいいでしょうか。C#のリスト内の複数のパラメータ。クラスなしで作成するには?

例:私は、通常そのようなクラスを使用します

var list = new List<string, int>(); 

list.Add("hello", 1); 

public class MyClass 
{ 
    public String myString {get; set;} 
    public Int32 myInt32 {get; set;} 
} 

を、次に行うことによって私のリストを作成します。

var list = new List<MyClass>(); 
list.Add(new MyClass { myString = "hello", myInt32 = 1 }); 
+3

あなたは本当にあなたは辞書ではなくリストを望んでいますか?あなたはおそらくあなたの実際の問題についてもう少し詳しく述べるべきです。そうすれば、あなたはなぜこのようにそれをやっているのかは明らかです。 –

+0

あなたは何のためにリストを使いたいですか? – Crisfole

+0

私は辞書がほしくありません。私は単純な例を使用しようとしていました... ASP.NET MVC 'Controller.Json' – Darcy

答えて

62

あなたは.NET 4.0を使用している場合Tupleを使用できます。 .NETの古いバージョンの

List<Tuple<T1, T2>> list; 

(あなたは、基本クラスライブラリで、あなたのニーズに合ったクラスを見つけることができるには十分に幸運でない限り)は、カスタムクラスを作成する必要があります。

+0

+1でJSON形式で返す2つの文字列を使用しますが、Tupleは.NET 4でも導入されました。 3.5彼はまだクラスを書くつもりです。 –

+0

@Jim Schubert:タプルを書いていない限り... – David

+0

@David:彼はそれを「クラスを作成せずに」行う方法を尋ねています。 –

20

あなたがTupleクラスを使用することができますimutableという項目を気にしない場合は、次の2つのアイテムを毎回追加され、そのうちの一つは、あなたが使用できる固有のIDである場合は4

var list = new List<Tuple<string,int>>(); 
list.Add(new Tuple<string,int>("hello", 1)); 

list[0].Item1 //Hello 
list[0].Item2 //1 

を.NETに追加しましたa Dictionary

4

Listは、1つのタイプパラメータのみを受け入れます。 あなたが一覧で買ってあげる最も近いです:

var list = new List<Tuple<string, int>>(); 
list.Add(Tuple.Create("hello", 1)); 
6

適切であれば、あなたはまた、一般的なコレクションである辞書を使用する場合があります:

Dictionary<string, int> d = new Dictionary<string, int>(); 
d.Add("string", 1); 
+2

+1これはまさに私が提案しようとしていたものですが、質問の "params"の部分は彼が2つ以上のタイプを探していると信じています。 Dictionary(T、K)とList(T)はIEnumerableとICollectionを継承しているので、非常によく似た方法で使用できます。 –

+0

または 'Dictionary > myData =新しい辞書>();'キーでタプルされたデータを取得するために私が使用するもの – vinsa

0

スコット・チェンバレン(および他のいくつか)で述べたようにタプルは、あなたが不変の(つまり、読み取り専用の)オブジェクトを持っていても気にしなければ一番うまく動作します。

デビッドによって提案されたように、あなたは文字列値でint型を参照する、場合、たとえば、あなたは辞書

Dictionary<string, int> d = new Dictionary<string, int>(); 
d.Add("string", 1); 
Console.WriteLine(d["string"]);//prints 1 

、しかし、あなたはmutablyあなたの要素を格納する場合に使用する必要があります

var kvp=new KeyValuePair<int, string>(2, "a"); 
//kvp.Key=2 and a.Value="a"; 
kvp.Key = 3;//both key and 
kvp.Value = "b";//value are mutable 
:リストでは、とC#のためのstd ::ペア本質的であるKeyValuePairを使用することであろう辞書スタイルの参照システム、そして、あなたの最善の策(今つまり、唯一の真の解決策)を使用したくありません

もちろん、これは積み重ねられるので、もっと大きなタプルが必要な場合はements)をスタックするだけです。あなたがこれを行う場合は明らかに、補助機能を定義するべきでしょう。

あなたのタプルに3つ以上の要素が含まれている場合は、独自のクラスを定義することをお勧めします。あなたのような文を使用してtypedefの風を使用することができます。

using quad = KeyValuePair<KeyValuePair<int,string>, KeyValuePair<int,string>>; 

が、それはあなたのインスタンスがどの楽にしません。2つ以上の要素のタプルを扱うときにユーザー定義クラスを使用すると、テンプレートパラメータを記述する時間が大幅に短縮され、非定型コードに多くの時間を費やすことになります。

3

その他の推奨I Keyvalueペアのコレクションにメンバーを追加する際の煩わしさを避けるために、次のような構造にしてください。

これが意味することは、コンストラクタは、より良い構文で初期化することができるということである
public class KeyValuePairList<Tkey,TValue> : List<KeyValuePair<Tkey,TValue>>{ 
    public void Add(Tkey key, TValue value){ 
     base.Add(new KeyValuePair<Tkey, TValue>(key, value)); 
    } 
} 

::

var myList = new KeyValuePairList<int,string>{{1,"one"},{2,"two"},{3,"three"}}; 

私個人的には、より詳細な例を超える上記のコードのような不幸なC#は本当にネイティブにタプルタイプをサポートしていません。この小さなハックは不思議に作用します。

実際に2以上のものが必要な場合は、タプルタイプに対して抽象クラスを作成することをお勧めします(Tupleは、KeyValuePairのような構造体ではありませんが、これは興味深い違いです)。

奇妙なことに、初期化リストの構文はIEnumerableで利用でき、オブジェクトで実際には列挙できないものであってもAddメソッドを使用できます。 object[]メンバーをparams object[]メンバーとして追加すると便利です。

-2

これは私と一緒にクラスを使用したい人のために

List<string> myList = new List<string>(); 
myList.Add(string.Format("{0}|{1}","hello","1") ; 


label:myList[0].split('|')[0] 
val: myList[0].split('|')[1] 
+0

これは文字列自分自身が|サインは、その後、物事を壊すだろう。 – Ondrej

0

を正常に動作します。

あなたは

パラメータ

class MyClass 
 
     { 
 
      public string S1; 
 
      public string S2; 
 
     } 
 

 
List<MyClass> MyList= new List<MyClass>();

1

として別の解決策をクラスのリストを作成します匿名型の一般的なリストを作成したいすべてのパラメータを持つクラスを作成します。

var list = new[] 
{ 
    new { Number = 10, Name = "Smith" }, 
    new { Number = 10, Name = "John" } 
}.ToList(); 

foreach (var item in list) 
{ 
    Console.WriteLine(item.Name); 
} 

これはまた、あなたのintellisenseサポートを与え、私はTupleDictionaryよりもその優れたいくつかの状況ではと思います。

0

データベースからスキーマ名とテーブル名を取得します。

 public IList<Tuple<string, string>> ListTables() 
     { 

      DataTable dt = con.GetSchema("Tables"); 

      var tables = new List<Tuple<string, string>>(); 

      foreach (DataRow row in dt.Rows) 
      { 
      string schemaName = (string)row[1]; 
      string tableName = (string)row[2]; 
      //AddToList(); 
      tables.Add(Tuple.Create(schemaName, tableName)); 
      Console.WriteLine(schemaName +" " + tableName) ; 
      } 
      return tables; 
     } 
関連する問題