uniq and array of enum members (That are all strings)

bauss jj_1337 at live.dk
Wed Jan 16 16:21:12 UTC 2019


On Wednesday, 16 January 2019 at 16:12:28 UTC, H. S. Teoh wrote:
> On Wed, Jan 16, 2019 at 03:57:49PM +0000, bauss via 
> Digitalmars-d-learn wrote:
>> Is there a way to achieve the following:
> [...]
>> enum Foo : string
>> {
>>     a = "aa",
>>     b = "bb",
>>     c = "cc"
>> }
>> 
>> void main()
>> {
>>     auto a = [Foo.a, Foo.b, Foo.a, Foo.b, Foo.c];
>> 
>>     auto b = a.uniq;
>> 
>>     writeln(b);
>>     // Expected output: [a, b, c]
>>     // Outputs: [a, b, a, b, c]
>> }
>
> .uniq only works on adjacent identical elements.  You should 
> sort your array first.
>
> If you need to preserve the original order but eliminate 
> duplicates, then you could use an AA to keep track of what has 
> been seen. E.g.:
>
> 	bool[string] seen;
> 	auto b = a.filter!((e) {
> 			if (e in seen) return false;
> 			seen[e] = true;
> 			return true;
> 		});
>
>
> T

Sorting will not work in my case though because it's an enum of 
strings that are not sorted alphabetically.

Right now I'm doing it manually by a foreach in similar way 
you're using filter.

I just feel like that's an overkill for something so trivial.


More information about the Digitalmars-d-learn mailing list