2011-07-25 8 views
2

と言うことは、各項目の意味のリストを持っている場合は、strGroupの各項目に名前を付ける方法文字列グループ内のアイテムに名前を付ける方法は?

string[] strGroup=returnStr.split(','); 

?だから、特定のアイテムを使う必要があるときは、strGroup[23]の代わりにstrGroup["LastName"]を使うだけです。

+4

しかし、あなたの文字列にはどのような名前が定義されていますか?これは列名を含む最初の行のCSVファイルですか? – Vasea

答えて

0

あなたは文字列の辞書を見る必要があると思います。

string[] data = returnStr.Split(','); 
var map = new Dictionary<string, string>(); 
map["LastName"] = data[23]; 
map["FirstName"] = data[24]; // or whatever 

ここで、文字列配列ではなくマップを使用します。

string firstName = map["FirstName"]; 
2

アレイは、文字列indexerを有していないので、これは、次のようなことは不可能です。

文字列の各部分の名前を定義する必要があります - Splitはそうしません。

は、定義された文字列indexerを持つ構造体を使用しますが、各項目のキーを定義する必要があります。

にはどこかのメタデータがある場合を除き、この定義が行われる魔法はありません。たとえば、一部のCSVパーサーは、フィールド名として最初の行を使用してそのようなコレクションを生成します。

0

これは、Dictionary<TKey,TValue>クラスのためのものです。あなたの場合はDictionary<string,string>が必要です。ただし、アイテムを名前でアクセスするには、そのアイテムを一度初期化する必要があります。

0

文字列が1つだけの場合は、Dictionary<string, string>データ型を使用します。

分割された文字列の完全なリストがある場合は、DataTableを使用して列名を使用します。このような

3

何か

string returnStr = "Claus,Junker,Jørgensen"; 

string[] keys = new string[] 
{ 
    "FirstName", 
    "MiddleName", 
    "LastName" 
}; 

Dictionary<string, string> groups = returnStr.Split(',') 
     .Select((x, i) => Tuple.Create(keys[i], x)) 
     .ToDictionary(k => k.Item1, v => v.Item2); 

// Alternative version 

Dictionary<string, string> groups = returnStr.Split(',') 
     .Zip(keys, (k, v) => new KeyValuePair<string, string>(k, v)) 
     .ToDictionary(k => k.Key, v => v.Value); 
+0

Uh ..これは非常に脆い解析ロジックになります。 – Zebi

+5

はい、もちろんです。しかし、そのようなクレイジーな質問は狂った答えに値します:p –

+0

あまりにも悪いですが、私はTupleをサポートしていない.NET 3.5を使用します。あなたのコードはとても素敵で、すばらしいです。私はまだ理解しようとしています。ありがとうございます。 –

1

私はあなたがCSVファイル/ストリームを読み取るためにsplitを使用しようとしている疑いがある(クレイジーLINQの話は、私が知っています)。

string[] strGroup=returnStr.split(','); 
var someThing = strGroup[GetIndex("LastName")]; 

と、このようなGetIndexを定義します:あなたは何ができるか

は、配列内の最初の行を格納し、分割を使用して、ファイルをwithing行を反復しながら、あなたは、このように参照することができますです

public int GetIndex(string str) 
{ 
    return Array.IndexOf<string>(headerArray, str); 
} 
1

多くの辞書の例がありますが、コードに行形式に関する知識を埋め込む場合は、そのクラスを作成しないでください。プロパティにreturnStrをオンにするコンストラクタを使用します。

class Group 
{ 
    public string FirstName { get; private set;} 
    public string LastName { get; private set;} 
    [...] 

    public Group(string returnStr) 
    { 
     string[] strGroup=returnStr.split(','); 
     [...] 
     this.FirstName = strGroup[22]; 
     this.LastName = strGroup[23]; 
     [...] 
    } 
} 

このアプローチでは、あなたは文字列定数のセットを維持する必要はありません。それが勝利かどうかは、あなたの特定の問題に依存します。

+0

良いアイデアもありがとうございます。 –

関連する問題