2012-05-02 10 views
-3

У меня есть функция ...Преобразовать System.Action в строку

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

это Func работает хорошо. Но я хочу:

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 To String ... Любая идея для этого?

+4

Я понятия не имею, что вы пытаетесь выполнить, ваш последний пример не имеет смысла. –

+0

Что именно вы пытаетесь отобразить? – Thousand

+0

Вы пытаетесь сказать, что хотите, чтобы label3.Text перечислил все результаты? –

ответ

11

Вы не действительно хотите преобразовать действие в строку. Вы хотите создать действие, которое что-то делает со значением. Я подозреваю вы можете что-то вроде:

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

(Это трудно сказать, но это моя лучшая догадка, основанная на примере кода.)

Это довольно неприятный, хотя, с точки зрения конкатенации. Возможно, вы хотите:

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

?

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

Или же с помощью встроенные лямбда-выражения:

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(); 
}); 
Смежные вопросы