I'm not totally clear about your question, but it seems you want to sort firstly by string length, then by alphabetical position.
You could try this as a LINQ solution:
vals = vals.OrderBy(str => str.Length).ThenBy(str => str).ToArray();
If you want a (rather more efficient) solution that does not use LINQ (though still makes nice use of lambda expressions), you could try the following:
Array.Sort(vals, (strA, strB) =>
{
var lengthComp = Comparer<int>.Default.Compare(strA.Length, strB.Length);
if (lengthComp == 0)
return string.Compare(strA, strB);
return lengthComp;
});
Hope that helps.