C# 将System.Action转换为字符串

C# 将System.Action转换为字符串,c#,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

我有一个功能

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=
从可枚举范围(0,array2.GetLength(0))中的x开始
.Where(x=>Math.Abs(x-refx)Math.Abs(y-refy)Math.Abs(x-refx)Math.Abs(y-refy)您并不是真的想将一个动作转换为字符串。您想创建一个具有值的动作。我怀疑您可能想要这样的动作:

neighbours.ToList().ForEach(x => label3.Text += x.ToString());
(很难说,但根据您的示例代码,这是我最好的猜测。)

不过,就字符串串联而言,这相当糟糕。也许您想要:

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

我认为这相当于

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

我不知道你想实现什么,你的最后一个例子毫无意义。你到底想显示什么?你想说你想要label3。文本到所有结果的列表中吗?正如你所看到的,你的问题被否决了。你应该努力解释你想实现什么。你可能会得到一些支持锿。。。
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();
});