使用静态void方法在WriteLine中输出

本文关键字:WriteLine 输出 方法 静态 void | 更新日期: 2023-09-27 18:14:47

如果标题不够准确,请随意更改为更合适的名称

所以我有一个公共静态void:
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'

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

使用静态void方法在WriteLine中输出

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

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

你应该决定你想要你的方法做什么,确切地-它是写到控制台,还是生成HTML?

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

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

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 />代替换行符)…

那么,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格式字符串中包含内容?

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

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。htmlcode 避免非html文本的转义

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

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

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

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