显示每个值从数组中计数

SAR*_*AMY -1 c#

我有一个string[]像这样的价值观

string[] s = { "saravanan", "Karthick", "Jackson", "saravanan" };
Run Code Online (Sandbox Code Playgroud)

我想看下面的输出

saravanan发生2次
Karthick发生1次
Jackson发生1次

如何在不使用 List或的情况下执行此操作Dictionary

这是我到目前为止所尝试的:

int i, j;
String[] s = {"saravanan", "Karthick", "Jackson", "saravanan"}

Console.WriteLine("Number of Times occured Each Values");

for (i = 0; i < s.Length; i++)
{
    int count = 0;
    for (j = 0; j < s.Length; j++)
    {
        if (s[i] == (s[j]))
        {
            count++;
        }
    }

    Console.WriteLine(s[i]+"is count="+count);
}
Run Code Online (Sandbox Code Playgroud)

该代码产生此输出:

发生的次数每个值 saravananis
计数= 2
Karthickis计数= 1
Jacksonis计数= 1
saravananis计数= 2

Dmi*_*nko 5

通常,我们通过Linq解决这些问题(查询)

  string[] s = new[] { 
    "saravanan", "Karthick", "Jackson", "saravanan" };

  var result = string.Join(Environment.NewLine, s
    .GroupBy(item => item)
    .Select(chunk => $"{chunk.Key} occures {chunk.Count()} times"));

  Console.Write(result);
Run Code Online (Sandbox Code Playgroud)

在的情况下,嵌套循环(当前的代码),我们应该不会打印出相同的名字多次.让我们来介绍bool appeared一下之前是否出现了名字

   string[] s = new[] { 
     "saravanan", "Karthick", "Jackson", "saravanan" };

   for (i = 0; i < s.Length; i++) {
     int count = 0;
     bool appeared = false;

     for (j = 0; j < s.Length; j++) {
       if (s[i] == (s[j])) {
         // Names are same. Do we have the name before?
         if (j < i) {
           // If yes we have no need to loop any more
           appeared = true;

           break;
         }

         count++;
       }
     }

    // if name has been appeared already we shouldn't print it out 
    if (!appeared) 
      Console.WriteLine(s[i] + "is count=" + count);
  }
Run Code Online (Sandbox Code Playgroud)

  • 好答案.很多次SO上的人用LINQ回答这些问题,这是一种非常不合适的技术(对于我们中最好的人来说,冗长的_dot符号_有可疑的可读性)对于那些显然不熟悉c#的OP来说如果不是一般的编程.如此令人耳目一新,看看以LINQ开头的答案,然后展示一个更有用的经典和更容易理解的实现.干得好先生!+1 (2认同)