assert(!find!("toLower(a) == b")(s, "hello").empty);

        assert(!find!("toLower(a) == b")(clist.name, "name2").empty);

But clist is an array of c's, it has no `.name` field by itself. So, put the `.name` call inside the comparator:

 
 assert( find!("toLower(a.name) == b")(clist, "name2").empty);

This gives me this code:

import std.algorithm: find;
import std.array: empty;
import std.uni: toLower;

struct C // Use UpperCase for you user-defined types
{
  int idx;
  string name;
}

C[] clist = [ {1, "name1"}, {2, "name2"}, { 3, "name3" } ];

void main() // no need to return 0
{
  auto target = clist.find!((a,b) => toLower(a.name) == b)("name2");
  assert(!target.empty);
}

Using UFCS (Universal Function Call Syntax) to tranform f(a,b) into a.f(b). I used it on `find`.



I went looking to replace several foreach statements. Can 'find' (in understand it's just a linear search) be used on an array of structures like above.

Sure, as long as you tell it how you will get the info from the range (it defaults to simple equality).

 

Example pulled and modified. Above code gives me (naturally) -
  ... no property 'name' for type 'cp[]'.

Interestingly, I had accidentally coded the commented out line before and it compiles correctly but will (as you guessed it) fail.

I never use pointers in D. I suppose the `.name` call is propagated to the array elements?