Использование статического метода void для вывода в WriteLine - PullRequest
2 голосов
/ 17 ноября 2011

Если название недостаточно точное, пожалуйста, измените его на более точное.

Итак, у меня есть публичная статическая пустота:

public static void outputDictionaryContents(Dictionary<string, int> list)
{
    foreach (KeyValuePair<string, int> pair in list)
    {
        Console.WriteLine("{0}, {1}", pair.Key, pair.Value);
    }
}

и я хочу записать, что он производит в html-файле, он будет нормально выводиться в командной строке через:

outputDictionaryContents(sortedDict);

но когда дело доходит до вывода его в моем html со следующим кодом:

tw.WriteLine("<td width\"480\">{0}</td>", outputDictionaryContents(sortedDict));

но я продолжаю получать следующую ошибку:

The best overloaded method match for 'System.IO.TextWriter.WriteLine(string, object)' has some invalid arguments
Argument '#2' cannon convert 'void' expression to type 'object'

Так что я не совсем уверен, как лучше всего решить эту проблему.

Заранее спасибо.

Ответы [ 8 ]

2 голосов
/ 17 ноября 2011

Что ж, да - похоже, вы ожидаете, что этот метод вернет строку, тогда как на самом деле он просто выводит ее на консоль.

Вам нужно не только заставить ваш метод возвращать строку - вам также нужно подумать о том, как бы вы отформатировали , если бы вы использовали HTML. Вы почти наверняка хотите как-то поместить каждое значение в отдельную строку - и для этого есть разные способы.

Вы должны решить, что именно должен делать ваш метод - для записи на консоль или для генерации HTML? Возможно, вам нужны оба метода.

1 голос
/ 17 ноября 2011

Самая простая вещь, которую вы могли ожидать, выглядит следующим образом:

public static string outputDictionaryContents(Dictionary<string, int> list)
{
    return string.Join(
         Console.Out.NewLine,
         list.Select(pair => string.Format("{0}, {1}", pair.Key, pair.Value)).ToArray());
}

Теперь о реальной цели:

Генерация HTML

Или вы можете сделать этонемного удобнее для генерации этого HTML:

public static class FormatAsHtmlExtensions
{
    public static IEnumerable<string> FormatAsHtml<K,V>(this IDictionary<K, V> dict, string format)
    {
        foreach (var pair in dict)
            yield return HttpServerUtility.HtmlEncode(string.Format(format, pair.Key, pair.Value));
    }

    public static IEnumerable<string> FormatAsHtml<K,V>(this IDictionary<K, V> dict)
    {
        return FormatAsHtml("{0}, {1}");
    }
}

, который вы можете затем использовать следующим образом:

// ...
Response.Write(dictionary.FormatAsHtml("<p>{0}<div style='value'>{1}</div>"));

Примечания

  • этот тип расширения работает для любой тип словаря, хеш-таблицы, ключа / значения и т. д. (вы можете добавить подобное для списков / массивов, расширив IEnumerable
  • Я добавил HttpServerUtility.HtmlEncode чтобы избежать часто забываемого экранирования текста не-HTML
1 голос
/ 17 ноября 2011

Ваш метод не возвращает строку - он записывает в консоль.

Вы можете изменить его так, чтобы он возвращал строку напрямую:

public static string GetDictionaryContents(Dictionary<string, int> list)
    {
        StringBuilder builder = new StringBuilder();
        foreach (KeyValuePair<string, int> pair in list)
        {
            builder.AppendFormat("{0}, {1}{2}", pair.Key, pair.Value, Environment.NewLine);
        }

        return builder.ToString();
    }

При этом, если вы собираетесь записать это в вывод HTML, вам, вероятно, нужно переосмыслить то, что вы хотите написать. Запись разделенной строкой информации непосредственно в ячейку таблицы не будет правильно отформатирована ...

Скорее всего, вы, как минимум, захотите дополнительное форматирование или предоставите отдельный терминатор (например, <br /> вместо новой строки) ...

1 голос
/ 17 ноября 2011

Ну, outputDictionaryContents имеет тип возврата void, поэтому outputDictionaryContents(sortedDict) - это выражение, которое оценивается как void.Таким образом, он недопустим в качестве параметра для TextWriter.WriteLine.

Самый простой подход состоит в том, чтобы изменить outputDictionaryContents, чтобы получить string.

public static string outputDictionaryContents(Dictionary<string, int> list) {
        var keyValuePairs = list.Select(
            kvp => String.Format("{0}, {1}", kvp.Key, kvp.Value)
        );
        return String.Join("\n", keyValuePairs);
}

Однако вам, вероятно, нужно добавить дополнительное форматирование и, возможно, изменить имя, так как оно выглядит как выВы включаете содержимое в строку в формате HTML?

0 голосов
/ 17 ноября 2011

В вашем статическом методе outputDictionaryContents вы записываете вывод в консоль, и этот метод не имеет возвращаемого значения.Измените метод следующим образом:

public static string outputDictionaryContents(Dictionary<string, int> list) 
{
     StringBuilder returnValue = new StringBuilder(); 
     foreach (KeyValuePair<string, int> pair in list) 
     { 
          returnValue.AppendFormat("{0}, {1}", new object[] { pair.Key, pair.Value }); 
     } 
     return returnValue.ToString();
} 
0 голосов
/ 17 ноября 2011

Вы не хотите писать в консоль, вы хотите вернуть строку, а затем передать ее в tw.WriteLine.

К вашему сведению, статичность не имеет к этому никакого отношения.

Итак, ваша функция должна выглядеть так:

public static string outputDictionaryContents(Dictionary<string, int> list)
        {
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, int> pair in list)
            {
                StringBuilder.AppendFormat("{0}, {1}", pair.Key, pair.Value);
            }
            return sb.ToString();
        }
0 голосов
/ 17 ноября 2011

Попробуйте изменить возвращаемую подпись метода outputDictionaryContents с void на, возможно, string.

0 голосов
/ 17 ноября 2011

Ваш метод не имеет возвращаемого значения.Это void.Это означает, что он не возвращает ничего, что может быть включено в вашу строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...