I'm just learning D. Something I often do in C# is have an IEnumerable (Range) of some type that is then conditionally filtered. It looks like this:

IEnumerable<Dictionary<string, string>> foo = bar;

if (baz)
{
    foo = foo.Where(d => d["key"] == value);
}

I'm trying to do the same in D. Here's what I want to do:

Range!(string[string]) records = csvReader!(string[string])(input, null);

if (where != "")
{
    records = filter!(r => r[where] == val)(records);
}

But Range!(string[string]) isn't right, even though that's what the csvReader and filter statements produce. How do I declare that type?

I do have a working example, but it's way too verbose (and not following D's indentation/bracket style... sorry about that!):

  auto gen = new Generator!(string[string])({
    auto records = csvReader!(string[string])(input, null);

    foreach (record; records) {
      yield(record);
    }
  });

  if (where != "") {
    auto prevGen = gen;
    gen = new Generator!(string[string])({
      auto records = filter!(r => r[where] == val)(prevGen);

      foreach (record; records) {
        yield(record);
      }
    });
  }

Thanks in advance!

Reply via email to