Слияние домашней почты (код гольф)

На днях я написал код слияния почты, и, хотя он работает, этот код меня выключил. Я бы хотел посмотреть, как это будет выглядеть на других языках.

Итак, для ввода подпрограмма принимает список контактов

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», а для фамилии - «фамилия семья».

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. Я с нетерпением жду более хорошей реализации на других языках.

Изменить: Куда подевался флажок сообщества вики? Пожалуйста, исправьте какой-нибудь мод.

7
задан 2 revs 7 November 2010 в 04:39
поделиться