Я думаю, что вы ищете:
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>
, считывающий и выдающий по одному элементу за раз.Возможно, вы захотите реализовать его с помощью блока итератора (yield return
и т. Д.).
Предполагается, что вы действительно хотите прекратить чтение, как только найдете первый объект, имеющий другую категорию.Если вы действительно хотите включить все соответствующие DataObject
с, измените TakeWhile
на Where
в приведенном выше запросе 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);
}
}
}
Вывод:
1: yes
2: yes
3: yes
4: yes
5: yes
Другими словами, в списке сохранились ссылки на 5 различных объектов, которые были возвращены из ReadNextFile
.