У меня есть string[] со значениями вроде
string[] s = { "saravanan", "Karthick", "Jackson", "saravanan" };
Я хочу увидеть результат ниже
saravanan occures 2 times
Karthick occures 1 times
Jackson occures 1 times
Как мне это сделать без использования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);
}
Этот код производит такой вывод:
Number of Times occured Each Values
saravananis count=2
Karthickis count=1
Jacksonis count=1
saravananis count=2





Обычно мы решаем такие проблемы (запрос) через 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);
В случае вложенные циклы (ваш текущий код) мы должны нет распечатать то же имя несколько раз. Давайте представим 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);
}
Большой! @MickyD У меня есть знания о linq, поэтому я даю такой ответ, и я хорошо знаю его работу, но мой ответ не за отрицательное голосование. Я всегда предпочитаю метод короткого кода. как бы то ни было.
@CoolJK, у вашего вопроса был 3 downvotes, я считаю, и аспекты, которые сделали его плохим ответом, что LINQ даже не вошел в него. Предположение, что кто-то проголосует против ответа, основанного исключительно на выборе технологии, возможно, неоправданно. Я подозреваю, что причиной отрицательных голосов был либо ответ только на код, либо то, что это просто не сработало. Я думаю, что большинству из нас нравится "короткий номер", но запутать и без того запутанный OP - не выход.
@CoolJK Спасибо за ваш код. Это очень полезно для меня, и я должен узнать о Linq сейчас. var groups = s.GroupBy (v => v); foreach (группа переменных в группах) Console.WriteLine ("{0} встречается {1} раз", group.Key, group.Count ());
Поскольку вы не хотите, чтобы "saravanan" появлялся дважды в вашем выводе. Затем вы можете использовать пустую строку в качестве контрольного значения. Когда вы найдете совпадения, которые увеличивают счет, очистите этот элемент и установите проверки, чтобы пропустить элемент, когда вы встретите его позже.
using System;
public class Program
{
public static void Main()
{
string[] s = { "saravanan","KArthick","Jackson","saravanan" };
for (int i = 0; i < s.Length; i++)
{
// Skip empty element
if (string.IsNullOrEmpty(s[i]))
{
continue;
}
int count = 1;
for (int j = i + 1; j < s.Length; j++)
{
// Skip empty element
if (string.IsNullOrEmpty(s[i]))
{
continue;
}
if (s[i] == s[j])
{
count++;
// Clear the element to indicate the element as already been counted
s[j] = string.Empty;
}
}
Console.WriteLine("{0} occurs {1} times", s[i], count);
}
}
}
Результат
saravanan occurs 2 times
KArthick occurs 1 times
Jackson occurs 1 times
вы можете использовать опцию группы linq следующим образом:
String[] s = {"saravanan", "Karthick", "Jackson", "saravanan"};
Console.WriteLine("Number of Times occured Each Values");
var groupArray = s.GroupBy(x => x);
foreach (var group in groupArray)
{
Console.WriteLine(group.Key + "is count = " + group.Count());
}
пожалуйста, проверьте, что это правда танки.
Хороший ответ. Очень часто на SO люди отвечают на подобные вопросы с помощью LINQ, техники, столь неприемлемой (а длинный точечная запись имеет сомнительную читабельность для лучших из нас) для OP, которые, очевидно, плохо знакомы с C#, если не программировать в целом. Так приятно увидеть ответ, начинающийся с LINQ, но затем показать более полезную классическую и более простую для понимания реализацию. Молодец, сэр! +1