我有一个函数可以分块读取文件。
public static DataObject ReadNextFile(){ ...}
数据对象看起来像这样:
public DataObject
{
public string Category { get; set; }
// And other members ...
}
我想做的基本上是下面的
List<DataObject> dataObjects = new List<DataObject>();
while(ReadNextFile().Category == "category")
{
dataObjects.Add(^^^^^ the thingy in the while);
}
我知道这可能不是它的完成方式,因为我如何访问我刚刚阅读的对象。
最佳答案
我想你要找的是:
List<DataObject> dataObjects = new List<DataObject>();
DataObject nextObject;
while((nextObject = ReadNextFile()).Category == "category")
{
dataObjects.Add(nextObject);
}
但我不会那样做。我会写:
List<DataObject> dataObject = source.ReadItems()
.TakeWhile(x => x.Category == "Category")
.ToList();
哪里ReadItems()
是一种返回 IEnumerable<DataObject>
的方法, 一次阅读并产生一个项目。您可能希望使用迭代器 block (yield return
等)来实现它。
这是假设您真的想在找到第一个具有不同类别的对象时立即停止阅读。如果你真的想包含所有匹配的DataObject
秒,
更改 TakeWhile
至 Where
在上面的 LINQ 查询中。
(编辑:赛义德此后删除了他对答案的反对意见,但我想我还是把这个例子留下来吧……)
编辑:证明这行得通,因为 Saeed 似乎不相信我:
using System;
using System.Collections.Generic;
public class DataObject
{
public string Category { get; set; }
public int Id { get; set; }
}
class Test
{
static int count = 0;
static DataObject ReadNextFile()
{
count++;
return new DataObject
{
Category = count <= 5 ? "yes" : "no",
Id = count
};
}
static void Main()
{
List<DataObject> dataObjects = new List<DataObject>();
DataObject nextObject;
while((nextObject = ReadNextFile()).Category == "yes")
{
dataObjects.Add(nextObject);
}
foreach (DataObject x in dataObjects)
{
Console.WriteLine("{0}: {1}", x.Id, x.Category);
}
}
}
输出:
1: yes
2: yes
3: yes
4: yes
5: yes
换句话说,该列表保留了对从 ReadNextFile
返回的 5 个不同对象的引用。 .
关于c# - while循环中的变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4431568/