2016-07-20 6 views
1

.txtファイルから情報を読み込み、クラスのインスタンスを作成しようとしています...各行に新しいインスタンスを作成する必要があります.txtファイルと私はそれぞれのinstaceの名前を整理したいと思います。 .txtファイルの最初の行でcard1という名前のインスタンスが作成され、別の行でcard2というinstaceが作成されます。実際に.txtファイルに行がたくさんあるので、このプロセスを自動化する必要がありますが、私はインスタンスの名前として文字列を使用することはできないようですので、動作しません...この問題を解決するものはありますか?あなたのお手伝いをありがとう...C#文字列に名前を持つオブジェクトのインスタンスをたくさん作成する

Console.WriteLine("Loading cards from .txt file"); 
using (StreamReader sr = new StreamReader(@"G:\Temp\cards.txt")) 
{ 
    string s; 
    int cardIndex = 1; 
    while ((s = sr.ReadLine()) != null) 
    { 
     string cardName = "card" + cardIndex.ToString(); 
     Card cardName = new Card(s) 
     cardIndex++; 
    } 
} 
+0

をコード?また、CardNameの代わりにCardに行の値を渡し、以前と同じ変数名を持つクラスを作成していることにも注意してください。 –

+1

「カード」とは何ですか?それはなぜ機能しないのですか? _variable_ nameとして 'card123'を使うつもりはないと思いますか? –

答えて

2

であなたのループ内のカードを作成することができ

public class Card 
{ 
    public readonly string Name; 
    public readonly string S; 

    public Card(string Name, string S) 
    { 
    this.Name = Name; 
    this.S = S; 
    } 

    public override ToString() 
    { 
    return Name; 
    } 
} 

あなたの問題は、あなたが両方Cardstring変数に同じ名前を使用することです。

Console.WriteLine("Loading cards from .txt file"); 
using (StreamReader sr = new StreamReader(@"G:\Temp\cards.txt")) 
{ 
    string s; 
    int cardIndex = 1; 
    Dictionary<string, Card> d = new Dictionary<string, Card>(); 

    while ((s = sr.ReadLine()) != null) 
    { 
     string cardName = "card" + cardIndex.ToString(); 
     Card card = new Card(cardName, s); 
     d.Add(s, card); 

     cardIndex++; 
    } 
} 

次に、あなたはcardNamesを渡すことができますし、何でもあなたが/クラスの実装を持つコンストラクタに応じcardにしたいです。

アクセスするには、好きな辞書の値にアクセスする方法を使用します。[]またはTryGetを指定します。


これはあなたの問題を解決しますが、私はコードにかなりリファクタリングすることをお勧めします。あなたがそのレベルにいて、何が起こっているのか理解しているならば、私は@Dmitryが(linqを使って)提案した方法に行きます。

それはindexを持っていることの、各lineのために、これらのオブジェクトを作成するための素晴らしく、エレガントな方法である - Upvote私から

0

クラスカードには名前付きのプロパティが必要です。あなたはToString()をオーバーライドするために "名前"を使うことができます。この例を見て:今、あなたは

Card NewCard = new Card(cardName, s); 
1

LINQの試してみてください:あなたは「カード」クラスを共有することができ

Card[] deck = File 
    .ReadLines(@"G:\Temp\cards.txt") 
    .Where(line => !string.IsNullOrEmpty(line)) 
    .Select((line, index) => new Card(string.Format("card{0}", index + 1), line)) 
    .ToArray(); // technically, materialization is not necessary 
関連する問題