我正在尝试从.txt文件加载一些信息然后创建一个类的实例...我需要为.txt文件中的每一行创建新实例,我想按顺序命名每个实例。 .txt文件中的第一行会创建和实例名为card1,另一行会创建名为card2的实例... .txt文件中确实存在很多行,所以我需要将这个过程自动化,但这就是我做的不起作用,因为我似乎不能使用字符串作为实例的名称......有什么东西可以解决这个问题吗?谢谢你的帮助...
System.out.println("Hello");
答案 0 :(得分:2)
您的问题是您对Card
和string
变量使用相同的名称。
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++;
}
}
然后,您可以根据您所拥有的构造函数/类的实现,将cardName
,s
以及您想要的任何内容传递给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);