将System.Action转换为String

时间:2012-05-02 18:47:55

标签: c#

我有一个功能...

var neighbours =
    from x in Enumerable.Range(0, array2.GetLength(0))
        .Where(x => Math.Abs(x - refx) <= 1)
    from y in Enumerable.Range(0, array2.GetLength(1))
        .Where(y => Math.Abs(y - refy) <= 1)
    select new { x, y };
neighbours.ToList().ForEach(Console.WriteLine);
这个功能运作良好。 但我想:

var neighbours =
    from x in Enumerable.Range(0, array2.GetLength(0))
        .Where(x => Math.Abs(x - refx) <= 1)
    from y in Enumerable.Range(0, array2.GetLength(1))
        .Where(y => Math.Abs(y - refy) <= 1)
    select new { x, y };
neighbours.ToList().ForEach(label3.Text);

它不起作用。 所以,我想将System.Action转换为String ... 对此有何想法?

2 个答案:

答案 0 :(得分:11)

确实想要将操作转换为字符串。您希望使用值创建执行某些操作的操作。我怀疑你可能想要这样的东西:

neighbours.ToList().ForEach(x => label3.Text += x.ToString());

(这很难说,但根据您的示例代码,这是我最好的猜测。)

在字符串连接方面,这非常令人讨厌。也许你想要:

string text = string.Join("\r\n", neighbours);
label3.Text = text;

答案 1 :(得分:0)

我认为相当于

neighbours.ToList().ForEach(Console.WriteLine);

会是这样的:

neighbours.ToList().ForEach(AppendLabelLine);

其中 AppendLabelLine 可以定义为:

private void AppendLabelLine(object o) {
   var sb = new StringBuilder(label3.Content as string);
   if (sb.Length > 0) sb.AppendLine();
   sb.Append(o);
   label3.Content = sb.ToString();
}

或者,使用内联lambda表达式:

neighbours.ToList().ForEach(o => {
   var sb = new StringBuilder(label3.Content as string);
   if (sb.Length > 0) sb.AppendLine();
   sb.Append(o);
   label3.Content = sb.ToString();
});