C#使用字符串中的名称创建一个对象的大量实例

时间:2016-07-20 11:23:56

标签: c#

我正在尝试从.txt文件加载一些信息然后创建一个类的实例...我需要为.txt文件中的每一行创建新实例,我想按顺序命名每个实例。 .txt文件中的第一行会创建和实例名为card1,另一行会创建名为card2的实例... .txt文件中确实存在很多行,所以我需要将这个过程自动化,但这就是我做的不起作用,因为我似乎不能使用字符串作为实例的名称......有什么东西可以解决这个问题吗?谢谢你的帮助...

 System.out.println("Hello");

3 个答案:

答案 0 :(得分:2)

您的问题是您对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

答案 1 :(得分: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 

答案 2 :(得分:0)

您的班级卡需要一个名称属性。您可以使用“名称”覆盖ToString()。看看这个例子:

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

现在您可以使用

在循环中创建一张卡片
Card NewCard = new Card(cardName, s);