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

use*_*760 0 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);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 删除包含检查并生成代码`if(exisiting.Add(employee.Id))`.如果项目已经在集合中,函数`HashSet <T> .Add(T item)`返回`false`.做一个`Contains`然后一个`Add`使它检查集合两次. (5认同)
  • 为什么不`yield return emplyee;`而不是创建第二个对象. (2认同)