while循环中的可变初始化

Tim*_*sen 5 c# initialization while-loop

我有一个以块的形式读取文件的函数.

public static DataObject ReadNextFile(){ ...}
Run Code Online (Sandbox Code Playgroud)

dataobject看起来像这样:

public DataObject
{
   public string Category { get; set; }

   // And other members ...
}
Run Code Online (Sandbox Code Playgroud)

基本上我想做的是以下内容

List<DataObject> dataObjects = new List<DataObject>();

while(ReadNextFile().Category == "category")
{
   dataObjects.Add(^^^^^ the thingy in the while);
}
Run Code Online (Sandbox Code Playgroud)

我知道它可能不是这样做的,因为我如何访问我刚读过的对象.

Jon*_*eet 21

我想你要找的是:

List<DataObject> dataObjects = new List<DataObject>();

DataObject nextObject;
while((nextObject = ReadNextFile()).Category == "category")
{
   dataObjects.Add(nextObject);
}
Run Code Online (Sandbox Code Playgroud)

但我不会这样做.我写道:

List<DataObject> dataObject = source.ReadItems()
                                    .TakeWhile(x => x.Category == "Category")
                                    .ToList();
Run Code Online (Sandbox Code Playgroud)

ReadItems()一个方法在哪里返回,一次IEnumerable<DataObject>读取和产生一个项目.您可能希望使用迭代器块(yield returnetc)来实现它.

这假设您确实希望在找到具有不同类别的第一个对象后立即停止阅读.如果您确实想要包含所有匹配的DataObjects,TakeWhileWhere在上面的LINQ查询中进行更改.

(编辑:赛义德已经删除了他对答案的反对意见,但我想我不妨留下这个例子......)

编辑:证明这将起作用,因为赛义德似乎不相信我:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1: yes
2: yes
3: yes
4: yes
5: yes
Run Code Online (Sandbox Code Playgroud)

换句话说,该列表保留了对已返回的5个不同对象的引用ReadNextFile.