c# - while循环中的变量初始化

标签 c# initialization while-loop

我有一个函数可以分块读取文件。

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秒, 更改 TakeWhileWhere在上面的 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/

相关文章:

c# - ZipFile 弄乱了汉字

C# 分隔 args 参数

c# - session 可以在 session 结束时间调用 dispose 方法吗?

没有初始化就使用 C++ 变量?

c++ - std::map 枚举的默认值

python - 使用按键重新启动 While 循环

c# - 如何使用 asp.net 检查在 TreeView 子节点中导航页面的权限?

javascript - 如何引用数据

python - 将 html 作为字符串循环一次

Python:在 while 循环中使用生成器