C# List.Foreach()投诉无法从';无效';至';对象';

C# List.Foreach()投诉无法从';无效';至';对象';,c#,.net-core,C#,.net Core,当我尝试运行下面的代码时,它告诉我最后一行的“无法从'void'转换为'object',有人知道代码有什么问题吗 提前谢谢 public static void Main(string[] args) { string s = "asfdsanfdjsajfois"; Dictionary<char, int> dict = new Dictionary<char, int>(); s.ToCharArray().ToList().ForEach(

当我尝试运行下面的代码时,它告诉我最后一行的“无法从'void'转换为'object',有人知道代码有什么问题吗

提前谢谢

public static void Main(string[] args)
{
    string s = "asfdsanfdjsajfois";
    Dictionary<char, int> dict = new Dictionary<char, int>();
    s.ToCharArray().ToList().ForEach(a => {
        dict[a] = (dict.ContainsKey(a)) ? dict[a]+1 : 1;
    });
    pln(dict.Keys.ToList().ForEach(a => Console.WriteLine(dict[a])));
}
publicstaticvoidmain(字符串[]args)
{
字符串s=“asfdsanfdjsajfois”;
Dictionary dict=新字典();
s、 ToCharArray().ToList().ForEach(a=>{
主语[a]=(主语[a])?主语[a]+1:1;
});
pln(dict.Keys.ToList().ForEach(a=>Console.WriteLine(dict[a]));
}

问题很明显,无需提供更多信息:


dict.Keys.ToList().ForEach(a=>Console.WriteLine(dict[a])
是一条不返回任何
void
的语句,您将其传递给
pln
函数,该函数接受
对象类型的参数。您需要为该类型向它传递一个对象,以使编译器满意,并使代码有意义。

查看这一部分:
.ForEach(a=>Console.WriteLine(dict[a])
;通过它,您可以迭代字典中的每个键,并将它们打印到控制台。实际上是
Console.WriteLine()
方法的返回类型为
void
,这意味着它不返回任何内容。但您试图将某个内容传递给名为
pln
的方法,但问题中没有指定该方法的定义方式或该方法中的预期值

实际上,您不需要遍历键然后收集值,您可以直接获取如下值:

dict.Select(x=>x.Value).ToList()
如果需要将每个值传递给计划方法,则应修改
pln
方法签名,如下所示:

 private static void pln(int p)
 {
     Console.WriteLine(p);
    // Do something here
 }
对此,查询将类似于
dict.ToList().ForEach(x=>pln(x.Value));

如果要将值作为列表传递,则方法签名将为:

private static void pln(List<int> p)
{
  // Do something here
}
私有静态无效pln(列表p)
{
//在这里做点什么
}

对此,查询将类似于
pln(dict.Select(a=>a.Value).ToList());

无需调用
s.tocharray().ToList()).ForEach
当你可以直接调用
s.ForEach
@jmchilinney呃?
ForEach
仅在
列表中定义。其他
IEnumerable
没有它。普通
ForEach
可以工作,但不是你建议的。哦,那真是太傻了……我把它放在pln方法中了……哈哈哈,谢谢everyone@hvd哎呀,我nt
s.ToList().ForEach
.A
String
已经是
IEnumerable(字符)
,因此不需要调用
ToCharArray