C#创建一个字符串中有名称的对象的许多实例

本文关键字:有名称 对象 实例 许多 字符串 一个 创建 | 更新日期: 2023-09-27 17:57:45

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

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

C#创建一个字符串中有名称的对象的许多实例

您的问题是对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创建这些对象的漂亮而优雅的方式

尝试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 

您的类Card需要一个具有名称的属性。您可以使用"name"来覆盖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);