Я прошу прощения за предоставление нескольких ответов, я все еще новичок в попытках скинуться и предложить ответы. FWIW: в свете нового комментария от zyzhu со ссылкой на добавление новой перегрузки;Я думал, что предложу еще одно решение, чтобы помочь вам. Я думаю, что перегрузка оператора '+' для строки будет хорошим дополнением. Я также думаю, что здесь нужно гораздо больше, чего можно достичь, создав метод мутатора и получив делегата, который позволит пользователю определить мутацию. Вполне возможно, что пользователь может захотеть больше, чем простые мутации, и может захотеть сделать некоторые реальные вычисления или другие изменения. Рассмотрим этот метод расширения и его примеры, и, пожалуйста, извините за отсутствие проверки ошибок или поддержки чего-либо, кроме примитивных типов ...
public static class FrameMutator
{
/// <summary>
/// For a frame of type Frame<TRow,TCol> mutate its rows of type TVal and create a new column with the results
/// </summary>
/// <typeparam name="TRow">Row Type</typeparam>
/// <typeparam name="TVal">Value Type</typeparam>
/// <typeparam name="TCol">Column Type</typeparam>
/// <param name="myFrame"></param>
/// <param name="mutatorMethod">delegate for transformation</param>
/// <returns>Series<K, V></returns>
public static Series<TRow, TVal> Mutate<TRow,TVal,TCol>(this Frame<TRow, TCol> myFrame, Func<TVal[], TVal> mutatorMethod)
{
SeriesBuilder<TRow, TVal> result = new SeriesBuilder<TRow, TVal>();
foreach (TRow key in myFrame.Rows.Keys)
{
TVal colResult = mutatorMethod(myFrame.Rows[key].GetValues<TVal>().ToArray());
result.Add(key, colResult);
}
return result.ToSeries();
}
}
Это расширение может использоваться следующим образом ...
static void add_ints(string root)
{
Deedle.Frame<int, string> df = Frame.ReadCsv("data_ints.csv");
Series<int, int> a = df.GetColumn<int>("A");
Series<int, int> b = df.GetColumn<int>("B");
//creates a column with the average of the row (not so useful with int)
Series<int, int> avgCol = df.Mutate<int, int, string>(avgMutator);
Series<int, int> c = a + b;
df.AddColumn("C", c);
df.AddColumn("D", avgCol);
df.Print();
}
static void add_strings(string root)
{
Deedle.Frame<int, string> df = Frame.ReadCsv("data_strings.csv");
Series<int, string> a = df.GetColumn<string>("L");
Series<int, string> b = df.GetColumn<string>("R");
//creates a column of concatenanted values
Series<int,string> concatCol = df.Mutate<int,string,string>(ConcatMutator);
//creates a column of concatenated and UPPER values
Series<int, string> upperCol = df.Mutate<int, string, string>(ToUpperMutator);
df.AddColumn("C", concatCol);
df.AddColumn("D", upperCol);
df.Print();
}
private static string ConcatMutator(string[] inputs) => string.Concat(inputs);
private static string ToUpperMutator(string[] inputs)
{
IEnumerable<string> uppers = inputs.Select(e => e.ToUpper());
return string.Concat(uppers);
}
private static int avgMutator(int[] inputs) => (int)Math.Round(inputs.Average(), 0);