我正在尝试使用C#?</class>从文本文件中填充我的List <class>

时间:2013-11-22 20:04:42

标签: c# wpf arrays class

我有一个名为cEspecie的类

public class cEspecie
{
    private string name;
    private int lifetime;
    private int movility;
    private int deadto;
    private int type;

public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name= value;
        }
    }
public int Type
    {
        get
        {
            return type;
        }
        set
        {
            type = value;
        }
    }
public int LifeTime
    {
        get
        {
            return lifetime;
        }
        set
        {
            lifetime= value;
        }
    }
public int Movility
    {
        get
        {
            return movility;
        }
        set
        {
            movility = value;
        }
    }
public int DeadTo
    {
        get
        {
            return deadto;
        }
        set
        {
            deadto = value;
        }
    }
}

我将一些数据存储在名为

的列表中
List<cEspecie> list = new List<cEspecie>() { 
new cEspecie("Wolf", 100, 10, 0, 0)
new cEspecie("Rabiit", 100, 100, 1, 1), 
new cEspecie("Lion", 200, 10, 2, 2), 
new cEspecie("Tiger", 300, 10, 3, 3),  
};

在我的程序的一个过程中,我使用以下方法将所有数据存储在文本文件中:

using (StreamWriter sr = new StreamWriter(@"../../Archives/TextFilecEspecie.txt"))
        {
            foreach (var item in list)
            {   
                sr.WriteLine(item.Name);
                sr.WriteLine(item.Type);
                sr.WriteLine(item.Movility);
                sr.WriteLine(item.LifeTime);
                sr.WriteLine(item.DeadTo);
            }
            sr.Close();
        }

“TextFilecEspecie.txt”中的结果是:

Wolf
100
10
0
0
Rabiit
100
100
1
1
Lion
200
10
2
2
Tiger
300
10
3
3

现在我真正的,真正的问题是......我怎样才能找回相同的数据来存储在同一个列表中?我正在使用c#和wpf,我真的没有找到答案。

6 个答案:

答案 0 :(得分:5)

使用LINQ,以及来自Microsoft优秀Ix-Main packageBuffer扩展方法。

var species = File.ReadLines("file.txt")
                .Buffer(5)
                .Select(x => new cEspecie
                {
                    Name = x[0],
                    Type = int.Parse(x[1]),
                    Movility = int.Parse(x[2]),
                    LifeTime = int.Parse(x[3]),
                    DeadTo = int.Parse(x[4])
                });

Buffer(5)会将每5行分组为一个数组。

答案 1 :(得分:2)

这就是序列化和ISerializable的用途。

Here is a quick tutorial应该让它变得相当简单。

我甚至可能会推荐JSON.Net,它会以JSON格式编写它,以便您可以更轻松地创建/编辑文件中的对象。

答案 2 :(得分:1)

您只能使用StreamReader向后执行同样的操作来读取文件。我不会详细说明,因为我猜你可以使用学习经验,所以考虑到这一点是正确的方向和作业:)

答案 3 :(得分:0)

你可以这样做

        var list = new List<cEspecie>();
        using (StreamReader reader = File.OpenText(filePath))
        {
            while(!reader.EndOfStream)
            {
                string name = reader.ReadLine();
                int type = int.Parse(reader.ReadLine());
                int movility = int.Parse(reader.ReadLine());
                int lifeTime = int.Parse(reader.ReadLine());
                int deadTo = int.Parse(reader.ReadLine());
                list.Add(new cEspecie(name, type, movility, lifeTime, deadTo));
            }
        }

请注意:

  1. int.Parse throw error如果字符串不是int,请使用TryParse,数据可能不是int
  2. 仅当文件具有正确的行数
  3. 时才能执行此操作

答案 4 :(得分:0)

var list = File.ReadLines("path").Select(x => new cEspecie(x));

cEspecie构造函数中,您可以使用输入行初始化对象。

答案 5 :(得分:0)

这样的事情非常简单,应该可行。但是要做错误检查。

List<cEspecie> list = new List<Persona>();  
string[] readText = File.ReadAllLines(@"../../Archives/TextFilecEspecie.txt");

for(int i=0;i<readText.Length/5;i++)
{
    list.Add(new Persona(readText[i*5], readText[i*5+1], readText[i*5+2], readText[i*5+3], readText[i*5+4]));
}