如何拆分List <list <class>&gt;将它存储在另一个列表中?</list <class>

时间:2013-11-30 00:10:38

标签: c# wpf list

我正在努力填补我的

List<List<Class>> items1 = new List<List<Class>>();

所有值都在这样一个名为“TextFileItems1.txt”的文本文件中。

2
33
50
0
Termina Especie
1
72
0
1
Termina Especie
2
31
50
0
Termina Especie
2
32
50
0
Termina Especie
2
27
50
0
Termina Especie
2
37
50
0
Termina Especie
2
33
50
0
Termina Especie
2
20
50
0
Termina Especie
2
44
50
0
Termina Especie
2
29
50
0
Termina Especie

等等......我有960个元素

我的问题是主列表长度必须等于名为Length1的变量,子列表长度必须等于名为Length2的变量,例如

 Length1 = 40;
 Length2 = 24;

我的问题是,如何拆分文本文件以便将40 MainList和24 SubList插入items1?

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

3 个答案:

答案 0 :(得分:1)

这是一个非常简单的使用LINQ,循环创意和生成器。 Here it is on Complify

public static class EnumerationExtensions {
public static IEnumerable<IEnumerable<T>> SplitIntoGroupsOfSize<T>(IEnumerable<T> collection, int ofSize) {
    for(
        IEnumerable<T> remainingCollection = collection; 
        remainingCollection.Count() > 0; 
        remainingCollection = remainingCollection.Skip(ofSize) ) {
            yield return remainingCollection.Take(ofSize);
        }
}
}

var collection = Enumerable.Range(1, 22).ToArray();
var groups = EnumerationExtensions.SplitIntoGroupsOfSize(collection, ofSize: 4);
var res = String.Join("\n-------------\n", groups.Select(g => String.Join(", ", g) ) );
Console.WriteLine(res);

我可能会把它作为一个真实项目中的扩展方法,因为对于这类事情的预期,但complify有这些问题。

使用您的参数,递归解决方案也可能有效,但您知道... c#没有尾调用优化所以......

解释:认为for循环真的只是while循环的一个特例

for(initial condition; while this is true; do this before each but the first iteration) {}

事实证明,在这种情况下,这与我们需要的非常相似,但不是标准的整数索引设置,而是第三个条件只是跟踪我们尚未返回的值。

yield关键字基本上是一种创建枚举器的简单方法。事实上,这正是它编译的内容。因此,每当foreach循环(或Select()等)调用enumerator.MoveNext()时,我们都会运行代码,直到我们点击下一个yield return

答案 1 :(得分:0)

这是一个用于创建List<List<cEspecie>>的LINQ查询,内部列表为Length2

var result =
File.ReadAllLines("TextFile.txt")
    .Select((line, i) => new { Line = line, LineNumber = i })
    .GroupBy(a => a.LineNumber / 5,
             a => a.Line,
            (key, values) => new 
            {
                Number = key,
                Class = new cEspecie()
                {
                    LifeTime = int.Parse(values.ElementAt(0)),
                    Movility = int.Parse(values.ElementAt(1)),
                    DeadTo = int.Parse(values.ElementAt(2)),
                    Type = int.Parse(values.ElementAt(3)),
                    Name = values.ElementAt(4)
                }
            })
    .GroupBy(a => a.Number / Length2,
             a => a.Class,
             (key, values) => values.ToList())
    .ToList();

您可能会设置具有不同元素顺序的属性,因为我不知道顺序。

答案 2 :(得分:0)

    class Program
   {
    static void Main(string[] args)
      {
        List<cEspecie> cEspecieList = new List<cEspecie>();
        string[] myEspecieFile = File.ReadAllLines("file.txt");

        List<cEspecie> mainList = new List<cEspecie>(); 
        //here you can do the some for the sublist 
        for (int i = 0; i < myEspecieFile.Length; i=i+5)
        {

            cEspecie ces = new cEspecie()
            {
                Name = myEspecieFile[i],
                LifeTime = int.Parse(myEspecieFile[i + 1]),
                Movility = int.Parse(myEspecieFile[i + 2]),
                DeadTo = int.Parse(myEspecieFile[i + 3]),
                Type = int.Parse(myEspecieFile[i + 4])
            };

            mainList.Add(ces);                
        }

        // and then you can  iterate through  your mainList to add sub list  something  like this  
        foreach (var item in mainList)
        {
            item.cSubEspecieList = mainList;  
        }


    }

}
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;
        }
    }
    //you need only this property in oreder to create sublist 
    public List<cEspecie> cSubEspecieList
    {
        get;
        set;
    }
}