C#扩展方法中的Lambda

本文关键字:Lambda 方法 扩展 | 更新日期: 2023-09-27 18:21:55

假设我想写一个扩展方法,将一些数据从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();
        }
}

我可以用打电话

using (StreamWriter sw = new StreamWriter("data.csv"))
  myData.WriteCSVData(sw);

但假设myDataComplex[,],我想写复数的幅度,而不是全值。如果我能写:,那会很方便

using (StreamWriter sw = new StreamWriter("data.csv"))
  myData.WriteCSVData(sw, d => d.Magnitude);

但我不确定如何在扩展方法中实现它,也不确定它是否可能。

C#扩展方法中的Lambda

您可以编写现有方法的重载,如下所示:

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();
        }
}

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

using (StreamWriter sw = new StreamWriter("data.csv"))
    myData.WriteCSVData(sw, d => d.Magnitude);

定义一个具有参数类型T和返回类型字符串的委托。向委托类型为的方法WriteCSVData添加参数。

delegate string ExtractValueDelegate<T>(T obj);
public static void WriteCSVData<T>(this T[,] data,ExtractValueDelegte<T> extractor , StreamWriter sw) { ... }
// calling the method
 myData.WriteCSVData(sw, d => d.Magnitude.ToString());