Комбинации, находящие улучшение производительности - PullRequest
0 голосов
/ 10 октября 2019

Я использую 2 цикла, чтобы получить все слова из моего словаря , соответствующего шаблону. Он работает правильно, но проблема в том, что он говорит около 10 секунд, чтобы завершить операцию. Мне нужно повысить производительность, чтобы я мог более эффективно обрабатывать данные.

Сначала я использовал цикл foreach для своей работы, но узнал, что циклы for лучше выполняются, чем цикл foreach, поэтому я изменил циклы нацикл for, но время выполнения по-прежнему не заметно отличается. Я также пробовал циклы Parallel.ForEach , но они для меня неосуществимы, поскольку мне нужно показать некоторые случайные данные после выполнения метода, чтобы он выдавал ошибку, поскольку цикл все еще работал параллельно.

Здесь stringdata - это список строк, который содержит все возможные комбинации из 9 букв, поэтому он содержит около 500 комбинаций из 9 букв, которые имеют строковый тип. Словарь - это мой словарь, который содержит словарь слов и содержит около 100000 слов данных и имеет свойство строкового типа «Слово»

Вот полный код, который я использую:

Я использовал Facet для поиска комбинаций по этой ссылке:

https://www.codeproject.com/Articles/26050/Permutations-Combinations-and-Variations-using-C-G

List<string> lst = new List<string>();
for (var i = a; i < j; i++)
{
    lst.Add(i.ToString);
}
string data2 = string.Join("", lst);

List<char> lstchar = data2.ToCharArray().ToList();
List<string> stringdata = new List<string>();

for (int i = 2; i <= lst.Count; i++)
{
    var combis = new Facet.Combinatorics.Combinations<Char>(
        lstchar, i, Facet.Combinatorics.GenerateOption.WithoutRepetition);
    stringdata.AddRange(combis.Select(c => string.Join("", c)));
}

for (int i = 0; i < stringdata.Count; i++)
{
    var dat = stringdata[i].ToCharArray().GroupBy(x => x).ToList();
    var aa = Dictionary.Where(x => x.Word.Length == stringdata[i].Length)
        .Select(x => x);
    for (int j = 0; j < dat.Count; j++)
    {
        aa = aa.Where(
            x => x.Word.ToLower().Contains(dat[j].Key.ToString().ToLower()) &&
            x.Word.ToLower().ToCharArray().Count(y =>
                y.ToString() == dat[j].Key.ToString().ToLower()
            ) == dat[j].Count()).ToList();
    }
    TempDictionary.AddRange(aa);
}

Я хочу повысить производительность своей программы, чтобы я мог получать данные в 2 раза. -3 секунды вместо 10 секунд

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