我可以在使用yield return之前检查IEnumerable <t>

时间:2015-05-11 14:25:11

标签: c# yield-return

我通过逐个创建每个记录来创建流中的IEnumerable。如果Id已经存在,有没有办法检查我当前的结果,那么我不想将当前读取的记录添加到集合中。

public class Employee
{
    public string Name { get; set; }
    public string Country { get; set; }
    public string Rank { get; set; }
    public string Hours { get; set; }

    public static Employee Create(IDataRecord record)
    {
        return new Employee
        {
           Name = record["name"],
           Country = record["country"],
           Rank = record["rank"],
           Hours = record["hours"],
        };
    }
}

public IEnumerable<Employee> GetEmployees(TextReader stream)
{
    using (var reader = MyLibraryFunction(stream)
    {
       while (reader.Read())
       {
           yield return Employee.Create(reader);
       }
    }
}

var result = GetEmployees(stream);

编辑:这是一个简化的例子。我实际上想知道我是否可以访问集合中的现有记录。如果它已经存在,我想简单地更新一个字段(添加小时数),如果它不存在则应该添加。

1 个答案:

答案 0 :(得分:7)

使用所有产生的对象ID的hashset:

public IEnumerable<Employee> GetEmployees(TextReader stream)
{
    var exisiting = new HashSet<int>();
    using (var reader = MyLibraryFunction(stream)
    {
        while (reader.Read())
        {
            var employee = Employee.Create(reader);
            if (exisiting.Add(employee.Id)) {
                yield return employee;
            }
        }
    }
}
相关问题