views:

493

answers:

4

Consider a string array shaped like this:

  string[] someName = new string[] { "First", "MiddleName", "LastName" };

The requirement is to get the first character from each element in the array.

i.e.

FML

Previously have tried:

string initials = string.Concat(someName.Select(x => x[0]));

Question: What LINQ query would you write to concatenate all the name contained in the string array to give the initials?

+9  A: 

try this:

string shortName = new string(someName.Select(s => s[0]).ToArray());

or, if you suspect that any of the strings might be empty or so:

string shortName = new string(someName.Where(s => !string.IsNullOrEmpty(s))
                                      .Select(s => s[0]).ToArray());
Botz3000
If any of the strings are empty, this will throw
JaredPar
Meh. There, i fixed it. :P
Botz3000
+1  A: 
  string[] someName = new string[] { "First", "MiddleName", "LastName" };
  String initials = String.Join(".",someName.Select(x => x[0].ToString()).ToArray());

Produces

F.M.L

Stan R.
+5  A: 

This solution accounts for empty strings as well by removing them from the output

var shortName = new string(
  someName
    .Where( s => !String.IsNullOrEmpty(s))
    .Select(s => s[0])
    .ToArray());
JaredPar
that wont compile, you forgot ToArray()
Stan R.
@Stan, thanks, added
JaredPar
A: 
string initials = someName.Where(s => !string.IsNullOrEmpty(s))
                          .Aggregate("", (xs, x) => xs + x.First());
Joe Chung
Bonus points for using Aggregate instead of String.Join or a string constructor.
JSBangs
I dunno if thats bonus points worthy, its kind of overkill at this point :P
Stan R.
This is definitely overkill.
Shiva
Overkill perhaps, but Aggregate (aka reduce of map/reduce) is a useful thing to know about LINQ.
Joe Chung
Your creating a new string with every + operation so thats way less efficient than the above solutions.
dfowler