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

时间:2011-11-16 20:37:49

标签: c# methods static 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'

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

提前致谢。

8 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

您可以将其更改为直接返回字符串:

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 />而不是新行)...

答案 3 :(得分:1)

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

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文字

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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