Я написал код слияния на днях, и, хотя он работает, я отключен кодом.Я хотел бы посмотреть, как это будет выглядеть на других языках.
Так что для ввода подпрограмма берет список контактов
Jim,Smith,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Erica,Johnson,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Abraham,Johnson,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Marge,Simpson,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Larry,Lyon,52560 Free Street,,Toronto,Ontario,Canada,M4B 1V7
Ted,Simpson,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Raoul,Simpson,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Затем она объединит строки с тем же адресоми фамилия в одной записи.Предположим, строки не отсортированы).Код также должен быть достаточно гибким, чтобы поля можно было указывать в любом порядке (поэтому он должен принимать индексы полей в качестве параметров).Для семьи из двух человек это объединяет оба поля имени.Для семьи из трех или более имя устанавливается на «the», а фамилия на «фамилию family».
Erica and Abraham,Johnson,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Larry,Lyon,52560 Free Street,,Toronto,Ontario,Canada,M4B 1V7
The,Simpson Family,6388 Lake City Way,,Burnaby,British Columbia,Canada,V5A 3A6
Jim,Smith,2681 Eagle Peak,,Bellevue,Washington,United States,98004
Моя реализация на C # это:
var source = File.ReadAllLines(@"sample.csv").Select(l => l.Split(','));
var merged = HouseholdMerge(source, 0, 1, new[] {1, 2, 3, 4, 5});
public static IEnumerable<string[]> HouseholdMerge(IEnumerable<string[]> data, int fnIndex, int lnIndex, int[] groupIndexes)
{
Func<string[], string> groupby = fields => String.Join("", fields.Where((f, i) => groupIndexes.Contains(i)));
var groups = data.OrderBy(groupby).GroupBy(groupby);
foreach (var group in groups)
{
string[] result = group.First().ToArray();
if (group.Count() == 2)
{
result[fnIndex] += " and " + group.ElementAt(1)[fnIndex];
}
else if (group.Count() > 2)
{
result[fnIndex] = "The";
result[lnIndex] += " Family";
}
yield return result;
}
}
Мне не нравится, как я должен был делать делегат groupby.Я хотел бы, чтобы у C # был какой-то способ преобразовать строковое выражение в делегат.например, Func groupby = f => "f [2] + f [3] + f [4] + f [5] + f [1];"У меня такое ощущение, что что-то подобное можно сделать в Lisp или Python.Я с нетерпением жду более приятной реализации на других языках.
Редактировать: Куда делся флажок вики сообщества?Некоторые моды, пожалуйста, исправьте это.