Чтобы прочитать все символы из строки, введенной в текстовое поле, без дубликатов и количества каждого символа - PullRequest
4 голосов
/ 27 мая 2011

Я хочу прочитать все символы из строки, введенной в текстовом поле, без повторений с количеством каждого символа, а затем сохранить эти значения в двух столбцах сетки, используя C #, Asp.Net

, например: My name is Joe

Characters  Occurances
M               2
y               1
n               1
a               1
e               2
i               1
s               1
j               1
o               1
Total           11

и затем сохраните их в столбцах вида сетки

Ответы [ 4 ]

2 голосов
/ 27 мая 2011
string input = "My name is Joe";

var result = from c in input.ToCharArray()
             where !Char.IsWhiteSpace(c)
             group c by Char.ToLower(c)
             into g
             select new Tuple<string, int>(g.Key.ToString(),g.Count());

int total = result.Select(o => o.Item2).Aggregate((i, j) => i + j);

List<Tuple<string, int>> tuples = result.ToList();

tuples.Add(new Tuple<string, int>("Total", total));

И вы можете привязать список данных tuples к DataGrid:)

2 голосов
/ 27 мая 2011

Вы можете использовать оператор LINQ GroupBy:

string str = ":My name is Joe";

var result = str.Where(c => char.IsLetter(c)).
                 GroupBy(c => char.ToLower(c)).
                 Select(gr => new { Character = gr.Key, Count = gr.Count()}).
                 ToList();

Это даст вам список объектов с полями Character и Count.

РЕДАКТИРОВАТЬ: я добавил предложение Where, чтобы отфильтровать не буквенные символы. Также добавлена ​​нечувствительность к регистру

Теперь вы должны использовать список result в качестве источника привязки для вашей сетки. Мое понимание процесса связывания ASP.NET немного ржаво. Возможно, вам потребуется создать объекты некоторого класса со свойствами Character и Count вместо анонимных объектов (вы не можете привязать к полям)

0 голосов
/ 06 декабря 2012

Я попробовал простое консольное приложение .. надеюсь, это поможет вам .. вы можете просмотреть это на Решение алгоритмов с помощью C #

enter image description here

Вотрезультат:

enter image description here

0 голосов
/ 28 мая 2011

Если вам не нравятся решения LINQ, вот как это можно сделать с помощью циклов foreach:

string str = ":My name is Joe";

var letterDictionary = new Dictionary<char,int>();

foreach (char c in str) {
    // Filtering non-letter characters
    if (!char.IsLetter(c))
        continue;

    // We use lowercase letter as a comparison key
    // so "M" and "m" are considered the same characters
    char key = char.ToLower(c);

    // Now we try to get the number of times we met
    // this key already.
    // TryGetValue method will only affect charCount variable
    // if there is already a dictionary entry with this key,
    // otherwise its value will be set to default (zero)
    int charCount;
    letterDictionary.TryGetValue(key, out charCount);

    // Either way, we now have to increment the charCount value
    // for our character and put it into dictionary
    letterDictionary[key] = charCount + 1;  
}

foreach (var kvp in letterDictionary) {
    Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);
}

Вывод последнего цикла будет:

m: 2
y: 1
n: 1
a: 1
e: 2
i: 1
s: 1
j: 1
o: 1

Теперь вы должны использовать какую-то технику из других ответов, чтобы превратить результат в список значений, которые можно привязать к сетке данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...