www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Learning to use ranges instead of arrays

reply "Bob Tolbert" <bob tolbert.org> writes:
I find myself writing this code too much and i'm curious what D
idiom I am missing.

given a list of files (or any strings) and then maybe I want to
sort them and maybe I don't.

      string [] fileList;

      ... fill list

      if (sort) {
          string [] tempList;
          foreach(filename; sort(fileList)) {
              tempList ~= filename;
          }
          fileList = tempList;
      }

      foreach(filename, fileList) {
          ... do something;
      }

but I know this is ugly code, so I'm curious as to how to make it 
better. I suspect it is something very simple, about switching 
everything I do to 'ranges', but I can't see it yet.

Thanks for any input,
Bob
Jul 20 2014
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Sunday, 20 July 2014 at 16:02:05 UTC, Bob Tolbert wrote:
 I find myself writing this code too much and i'm curious what D
 idiom I am missing.

 given a list of files (or any strings) and then maybe I want to
 sort them and maybe I don't.

      string [] fileList;

      ... fill list

      if (sort) {
          string [] tempList;
          foreach(filename; sort(fileList)) {
              tempList ~= filename;
          }
          fileList = tempList;
      }

      foreach(filename, fileList) {
          ... do something;
      }

 but I know this is ugly code, so I'm curious as to how to make 
 it better. I suspect it is something very simple, about 
 switching everything I do to 'ranges', but I can't see it yet.

 Thanks for any input,
 Bob
Even without ranges, you can do this: string [] fileList; ... fill list if (sort) sort(fileList); foreach(filename, fileList) { ... do something; } because sort works in-place.
Jul 20 2014
parent reply "Bob Tolbert" <bob tolbert.org> writes:
On Sunday, 20 July 2014 at 16:11:03 UTC, John Colvin wrote:
 Even without ranges, you can do this:

       string [] fileList;

       ... fill list

       if (sort)
           sort(fileList);

       foreach(filename, fileList) {
           ... do something;
       }

 because sort works in-place.
Oh, I see that now. Guess when I saw it returned a SortedRange, I stopped reading and missed the bit about the underlying array also being sorted. Thanks for the quick help, Bob
Jul 20 2014
parent "Ivan Kazmenko" <gassa mail.ru> writes:
Also, there is std.array.array for the ranges you want to convert 
to arrays.
For example, if "a" is an array, "a.map!(x => x * 2).array" 
produces an new array of doubled values (as opposed to a lazy 
range produced by std.algorithm.map).
Jul 20 2014