我正在努力填补我的
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;
}
}
}
答案 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;
}
}