我有一个对象列表。我想根据每个项目Repeat
属性的连续顺序迭代每个项目。
列表:
var files = new List<SDetail>();
files.Add(new SDetail { FileName = "file1", Sec = 40, Repeat = 39 });
files.Add(new SDetail { FileName = "file2", Sec = 10, Repeat = 24 });
files.Add(new SDetail { FileName = "file3", Sec = 150, Repeat = 2 });
我已根据Repeat
属性完成了列表填充。
这是我试过的片段。
if(files.Count > 0)
{
foreach (var item in files)
{
for (int i = 0; i < item.Repeat;)
{
checkItem.Add(item.FileName);
i++;
}
}
}
if(checkItem.Count > 0)
{
foreach (var item in checkItem)
Console.WriteLine(item);
}
我获得上述代码段的输出,如file1(39次),file2(24次),file3(2次)。
输出应该是这样的(顺序列表项):
file1的
文件2
文件3
文件1
文件2
文件3
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件2
文件1
文件1
文件1
文件1
文件1
文件1
文件1
文件1
文件1
文件1
文件1
文件1
文件1
文件1
file1的
答案 0 :(得分:2)
因此,对代码的回答是,您应该遍历整个files
集合,直到剩下Repeat
为止。
while(files.Any(f => f.Repeat > 0))
{
foreach(var f in files)
{
if(f.Repeat > 0)
{
checkItem.Add(f.FileName);
f.Repeat--;
}
}
}
if(checkItem.Count > 0)
{
foreach (var item in checkItem)
Console.WriteLine(item);
}
当然,除非您被禁止更改SDetail
个对象,否则这是有效的。
答案 1 :(得分:0)
您需要更改迭代的工作方式。由于输出列表的顺序很重要,迭代的顺序也很重要!
我添加的是一个计数器,iterationCounter
。对于每次迭代,我们将检查列表中的所有项目,选择仍需要重复的项目,获取他们的FileName
属性,并将其添加到我们正在构建的列表中。 (然后我们开始另一次迭代)
只有在不再添加项目时,迭代才会停止。
iterationCounter = 1
上,我们必须获取FileName
Repeat >= 1
个属性
iterationCounter = 2
上,我们必须获取FileName
Repeat >= 2
个属性
iterationCounter = 3
上,我们必须获取FileName
Repeat >= 3
个属性
醇>
我认为你可以看到每一行都经常使用1,a 2或3.因此,逻辑可以围绕这个增加的iterationCounter
进行构建。
public static List<String> MakeMyList(List<File> myListOfFiles)
{
List<String> outputlist = new List<string>();
int iterationCounter = 0;
bool thereWereNamesAdded = true;
while(thereWereNamesAdded)
{
//Increment the counter
iterationCounter++;
//Find the names that still need to be added in this iteration
List<String> theFileNames = myListOfFiles.Where(x => x.Repeat >= iterationCounter)
.Select(x => x.FileName)
.ToList();
//Add the found names to the loop
outputlist.AddRange(theFileNames);
//If no file names were added in this loop,
//set the boolean to false and exit the iteration
thereWereNamesAdded = theFileNames.Any();
}
return outputlist;
}