A little late but here is a compact LINQ solution:
class Program
{
static void Main(string[] args)
{
var input = "App.MName, App.LName, CoApp.xxx.yyy.zzz, CoApp.LName, CoApp.CurrRes.Address, CoApp.CurrRes.Address.SubAddress1, CoApp.CurrRes.Address.SubAddress2, Veh.Year , LS.TotalAmount, TrdIn.Year";
var result = string.Join(",", input.Split(new[] { ',', ' ' },
StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(new[] { '.' }).ToList())
.GroupBy(y => y[0])
.Select(x => CustomGroup(x)));
Console.WriteLine(input);
Console.WriteLine();
Console.WriteLine(result);
Console.ReadKey();
}
private static string CustomGroup(IGrouping<string, IEnumerable<string>> group)
{
var items = group.Where(x => x.Skip(1).Any());
return items.Any()
? new StringBuilder()
.Append(group.Key)
.Append("(")
.Append(string.Join(",", items.Select(x => x.Skip(1))
.GroupBy(y => y.First())
.Select(x => CustomGroup(x))))
.Append(")")
.ToString()
: group.Key;
}
}
Outputs:
App.MName, App.LName, CoApp.xxx.yyy.zzz, CoApp.LName, CoApp.CurrRes.Address, CoApp.CurrRes.Address.SubAddress1, CoApp.CurrRes.Address.SubAddress2, Veh.Year , LS.TotalAmount, TrdIn.Year
App(MName,LName),CoApp(xxx(yyy(zzz)),LName,CurrRes(Address(SubAddress1,SubAddress2))),Veh(Year),LS(TotalAmount),TrdIn(Year)