Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>It's fairly easy to implement on your own:</p> <pre class="lang-dart prettyprint-override"><code>Iterable distinct(Iterable i) { var set = new Set(); return i.where((e) { var isNew = !set.contains(e); set.add(e); return isNew; }); </code></pre> <p>It'd be even nicer if <code>Set.add()</code> returned a bool that indicated whether the set was modified:</p> <pre class="lang-dart prettyprint-override"><code>Iterable distinct(Iterable i) { var set = new Set(); return i.where((e) =&gt; set.add(e)); } </code></pre> <p>You can file feature request bugs of course.</p> <p>Edit: As Florian points out, the above solution only works if the returned <code>Iterable</code> is only used once. Subsequent uses will return <code>Iterator</code>s with no elements, because even element has been seen already on the first use.</p> <p>To solve this we need to keep a visited set for every <code>Iterator</code> created from the returned <code>Iterable</code>, not just one for the <code>Iterable</code>. We can do that by creating <code>Iterable</code> and <code>Iterator</code> subclasses like with <code>WhereIterable</code>/<code>WhereIterator</code>:</p> <pre class="lang-dart prettyprint-override"><code>Iterable distinct(Iterable i) =&gt; new DistinctIterable(i); class DistinctIterable&lt;E&gt; extends Iterable&lt;E&gt; { final Iterable&lt;E&gt; _iterable; DistinctIterable(this._iterable); Iterator&lt;E&gt; get iterator { return new DistinctIterator&lt;E&gt;(_iterable.iterator); } } class DistinctIterator&lt;E&gt; extends Iterator&lt;E&gt; { final Iterator&lt;E&gt; _iterator; final Set&lt;E&gt; _visited = new Set&lt;E&gt;(); DistinctIterator(this._iterator); bool moveNext() { while (_iterator.moveNext()) { if (!_visited.contains(_iterator.current)) { _visited.add(_iterator.current); return true; } } return false; } E get current =&gt; _iterator.current; } </code></pre> <p>Yes, this is much longer, but it'll work correctly with many-use finite <code>Iterable</code>s and one-use infinite <code>Iterable</code>s. The infinite iterable use case could easily have problems with memory, which is an argument for not including it in the core lib and forcing developers to make some decisions about what exactly they need.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload