Lambda在C#扩展方法中

Ozz*_*zah 6 c# lambda extension-methods

假设我想编写一个扩展方法来将一些数据从a转储T[,]到CSV:

public static void WriteCSVData<T>(this T[,] data, StreamWriter sw)
{
    for (int row = 0; row < data.GetLength(0); row++)
        for (int col = 0; col < data.GetLength(1); col++)
        {
            string s = data[row, col].ToString();

            if (s.Contains(","))
                sw.Write("\"" + s + "\"");
            else
                sw.Write(s);

            if (col < data.GetLength(1) - 1)
                sw.Write(",");
            else
                sw.WriteLine();
        }
}
Run Code Online (Sandbox Code Playgroud)

我可以打电话给他

using (StreamWriter sw = new StreamWriter("data.csv"))
  myData.WriteCSVData(sw);
Run Code Online (Sandbox Code Playgroud)

但是假设myData是a Complex[,],我想写出复数的大小,而不是完整的值.如果我能写的话会很方便:

using (StreamWriter sw = new StreamWriter("data.csv"))
  myData.WriteCSVData(sw, d => d.Magnitude);
Run Code Online (Sandbox Code Playgroud)

但我不确定如何在扩展方法中实现它,或者甚至可能.

Ere*_*mez 8

您可以像这样编写现有方法的重载:

public static void WriteCSVData<T, TValue>(this T[,] data, StreamWriter sw, 
    Func<T,TValue> func)
{
    for (int row = 0; row < data.GetLength(0); row++)
        for (int col = 0; col < data.GetLength(1); col++)
        {
            string s = func(data[row, col]).ToString();

            if (s.Contains(","))
                sw.Write("\"" + s + "\"");
            else
                sw.Write(s);

            if (col < data.GetLength(1) - 1)
                sw.Write(",");
            else
                sw.WriteLine();
        }
}
Run Code Online (Sandbox Code Playgroud)

并按照您想要的方式使用它:

using (StreamWriter sw = new StreamWriter("data.csv"))
    myData.WriteCSVData(sw, d => d.Magnitude);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这正是我需要的! (2认同)