【问题标题】:Using static void method to output in WriteLine使用静态 void 方法在 WriteLine 中输出
【发布时间】:2011-12-30 19:03:45
【问题描述】:

如果标题不够准确,请随时将其更改为更恰当的名称。

所以我有一个公共静态无效:

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'

所以我不完全确定解决这个问题的最佳方法是什么。

提前致谢。

【问题讨论】:

  • 你到底想写什么?您的方法将输出发送到控制台,您打算将什么放入 &lt;td&gt; 单元格?

标签: c# methods static void


【解决方案1】:

是的 - 看起来您希望该方法返回字符串,而实际上它只是将其打印到控制台。

你不仅需要让你的方法返回一个字符串——你还需要考虑如果你使用 HTML,你将如何格式化它。您几乎可以肯定希望以某种方式将每个值放在单独的行上 - 有多种不同的方法可以做到这一点。

您应该确切地决定您希望您的方法做什么 - 是用于写入控制台还是生成 HTML?也许你想要这两种方法。

【讨论】:

    【解决方案2】:

    您的方法不会返回字符串 - 它会写入控制台。

    你可以改变它直接返回一个字符串:

    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 输出,您可能需要重新考虑要编写的内容。将换行符分隔的信息直接写入表格单元格不会正确格式化...

    您更有可能至少需要一些额外的格式,或提供单独的终止符(例如 &lt;br /&gt; 而不是换行符)...

    【讨论】:

    • 这很好用,是的,当我运行它时,我发现它的效果并不好,并在休息时摆脱了换行符。
    【解决方案3】:

    好吧,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 格式的字符串中?

    【讨论】:

    • 签名可能不应该是void
    • 这在 HTML 中仍然没有多大帮助。我认为 OP 应该退后一步,在深入修复实现之前考虑该方法的真正含义。
    【解决方案4】:

    您可能期待的最简单的事情是这样的:

    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 文本转义

    【讨论】:

      【解决方案5】:

      您的方法没有返回值。这是void。这意味着它不会返回任何可能包含在您的字符串中的内容。

      【讨论】:

        【解决方案6】:

        尝试将方法 outputDictionaryContents 的返回签名从 void 更改为 string

        【讨论】:

          【解决方案7】:

          您不想写入控制台,您想返回字符串,然后将其传递给 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();
                  }
          

          【讨论】:

            【解决方案8】:

            在您的静态方法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();
            } 
            

            【讨论】:

              猜你喜欢
              • 2018-10-22
              • 1970-01-01
              • 2018-10-27
              • 2021-02-04
              • 2019-06-29
              • 2015-12-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多