C# while循环中的变量初始化

C# while循环中的变量初始化,c#,initialization,while-loop,C#,Initialization,While Loop,我有一个函数,可以将文件分块读取 public static DataObject ReadNextFile(){ ...} dataobject看起来像这样: public DataObject { public string Category { get; set; } // And other members ... } public class ObjectReader : IEnumerator<DataObject> { public bool

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

public static DataObject ReadNextFile(){ ...}
dataobject看起来像这样:

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

   // And other members ...
}
public class ObjectReader : IEnumerator<DataObject>
{
    public bool MoveNext()
    {
       // try to read next file, return false if you can't
       // if you can, set the Current to the returned DataObject
    }

    public DataObject Current
    {
        get;
        private set;
    }
}
我想做的基本上是

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

while(ReadNextFile().Category == "category")
{
   dataObjects.Add(^^^^^ the thingy in the while);
}
List dataObjects=new List();
while(ReadNextFile().Category==“Category”)
{
添加(^^^^ while中的内容);
}

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

这是主观的,但我讨厌这种模式(我完全认识到我在这里是极少数)。当我需要这样的东西时,我是这样做的

var dataObjects = new List<DataObject>();
while(true) {
    DataObject obj = ReadNextFile();
    if(obj.Category != "category") {
        break;
    }
    dataObjects.Add(obj);
}
var dataObjects=newlist();
while(true){
DataObject obj=ReadNextFile();
如果(对象类别!=“类别”){
打破
}
dataObjects.Add(obj);
}
但是现在,最好说

List<DataObject> dataObjects = GetItemsFromFile(path)
                                   .TakeWhile(x => x.Category == "category")
                                   .ToList();
List dataObjects=GetItemsFromFile(路径)
.TakeWhile(x=>x.Category==“Category”)
.ToList();
当然,在这里,
GetItemsFromFile
path
指向的文件中读取项目,并返回一个
IEnumerable

List dataObjects=new List();
字符串类别=”;
而((category=ReadNextFile().category)==“category”)
{
添加(新数据对象{Category=Category});
}
如果你有更复杂的物体,你可以这样做(比如乔恩):

List dataObjects=new List();
var category=新数据对象();
而((category=ReadNextFile())。category==“category”)
{
添加(类别);
}

您应该研究在类容器上实现IEnumerator对ReadNextFile()的调用。然后,您将始终使用IEnumerator.current引用当前对象,并且MoveNext()将返回您要查找的bool以检查是否有进展。大概是这样的:

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

   // And other members ...
}
public class ObjectReader : IEnumerator<DataObject>
{
    public bool MoveNext()
    {
       // try to read next file, return false if you can't
       // if you can, set the Current to the returned DataObject
    }

    public DataObject Current
    {
        get;
        private set;
    }
}
公共类ObjectReader:IEnumerator
{
公共图书馆
{
//尝试读取下一个文件,如果无法读取,则返回false
//如果可以,将当前值设置为返回的数据对象
}
当前公共数据对象
{
得到;
私人设置;
}
}

我想你要找的是:

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

DataObject nextObject;
while((nextObject = ReadNextFile()).Category == "category")
{
   dataObjects.Add(nextObject);
}
输出:

1: yes
2: yes
3: yes
4: yes
5: yes

换句话说,该列表保留了对从
ReadNextFile

返回的5个不同对象的引用。您确定要问什么吗?我很难弄清楚您到底想要什么。很抱歉,我意识到我的问题非常模糊。这只是如何访问while(ReadNextElement())中的对象:在循环逻辑之前,这真的是您想要做的吗?你不想从文件中读取所有“匹配”的数据对象吗,不管中间是否有其他数据对象?@Timo:只是为了记录:我建议你的真实
DataObject
包含的属性比你正在测试的类别多吗?@Saeed:对不起,我之前的评论显然没有做到——我的3G网络连接不稳定。这将无法编译,因为您正在尝试向
列表添加字符串。我们的想法不是记住最后一个类别,而是记住最后一个
DataObject
。查看我的答案以获得固定版本。@Jon Skeet,我编辑了答案,谢谢,我没有考虑我只想显示
OP
想要的列表类型。@Saeed:Still-1,因为虽然我们只显示了Category属性,但在现实生活中,我希望对象中有更多数据。。。这会丢失您当前的代码。正如OP所说,他想记住他刚刚读过的对象,而不是从他过滤的一点信息中重建它。这并不难-看看我的答案。(还要记住,编辑答案和期望删除所有反对票之间只剩下2分钟。我碰巧在看这个问题,但不是每个人都会…)考虑到你的答案的前一个版本不会编译,即使现在它也不是真正需要的,我认为5张赞成票和3张反对票是相当慷慨的;)6年后,这仍然是一个糟糕的答案。第一个代码段没有执行OP要求的操作。事实上,它没有做任何人可能想做的事情。这使得试图理解这个答案是浪费时间。第二个代码段执行了要求的操作,但编写得很差:(1)变量
category
的名称很差,因为它不再包含类别。(2) 变量
category
初始化为默认数据对象。为什么?在这种情况下,它根本不需要初始化,因为它只在循环中使用。如果有任何问题,请将其初始化为null。@Saeed:你说的“因为这是不可能的”是什么意思?@Saeed:这肯定是一种奇怪的行为。@Saeed:这是一个不回答问题的答案。在我看来,这是个糟糕的答案。然而,这个答案——你否决的答案——确实回答了这个问题。除了因为其他人对你的答案投了反对票,你能给出任何理由对它投反对票吗?@Saeed:为什么“LINQ不是答案?”你说“第一个没有处理
OP
s签名”(sic)是什么意思?@Saeed:保留
while(ReadNextFile()。Category==“类别”)
part(顺便说一句,它不是签名).我知道你还认为这个答案的上升票是出于友谊,而不仅仅是同意这个答案…你还认为对你的下降票与对这个答案的上升票是一致的。在我的情况下是这样的,但你不应该认为对其他人是这样。@Saeed:嗯,我不是代表其他人说话,这是point-虽然你已经假设了对这个答案进行上表决和对你的答案进行下表决的动机。你不需要自己去解决实现它的所有麻烦-而是使用迭代器块。它们摇摆:)我同意你不需要,但如果这是该对象的目的(看起来是这样的)
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