Я согласен, что не так много дублирования, но, возможно, этот «буквальный перевод» в расширения Linq
это то, что вы ищете (наберите в браузере, поэтому еще не тестировали):
foreach (Car car in carList) {
DataRow row = NewRow();
row["configurations"] = car.Configurations.Aggregate(new StringBuilder(), (a,i) => a.AppendFormat("{0}: {1}\n", i.Name, i.Value));
row["optionals"] = car.Optionals.Aggregate(new StringBuilder(), (a,i) => a.AppendFormat("{0}, ", i.Name));
Rows.Add(row);
}
В качестве альтернативы, вы могли бы написать это несколько более разборчиво (/ эффективно?) Без строителей строк:
Извлечение лямбды сделало строки короче:
Func<Car, string> nameValue = car => string.Format("{0}: {1}\n", car.Name, car.Value);
foreach (var car in carList) {
var row = new Dictionary<string, string>();
row["configurations"] = string.Join("\n", car.Configurations.Select(nameValue));
row["optionals"] = string.Join(", ", car.Optionals.Select(i => i.Name));
list.Add(row);
}
Примечание Перед C # 4.0 вам нужно дополнительно .ToArray()
вызвать второй параметр для string.Join