Не могу найти уникальные слова - PullRequest
0 голосов
/ 24 ноября 2018

Может кто-нибудь сказать мне, что не так в моем коде?По сути, мне нужно добавить только уникальные слова из списка words1 в uniques, после того как я сравнил words1 и words2.В операторе if, если я удаляю !, он находит подходящие слова (в отличие от того, что мне нужно)

    List<string> Unique(string lines1 ,string lines2,  char[] separators)
    {
        string[] words1 = lines1.Split(separators, StringSplitOptions.RemoveEmptyEntries);
        string[] words2 = lines2.Split(separators, StringSplitOptions.RemoveEmptyEntries);
        List<string> uniques = new List<string>();

        for (int i = 0; i < words1.Length; i++)
        {
            bool match;
            for (int x = 0; x < words2.Length; x++)
            {
                if (!words1[i].Equals(words2[x]))
                {
                    match = true;
                    uniques.Add(words1[i]);
                    break;
                }
                else
                {
                    match = false;
                }
            }
        }

        return uniques;
    }

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Использование двух вложенных циклов имеет плохую производительность O (n 2 ).Используйте набор Union

return words1
    .Union(words2)
    .ToList();
0 голосов
/ 24 ноября 2018

Вы можете внести незначительные изменения в ваш цикл

    for (int i = 0; i < words1.Length; i++)
    {
        bool match=false;
        for (int x = 0; x < words2.Length; x++)
        {
            if (words1[i].Equals(words2[x]))
            {
                match = true;
                break;
            }

        }
        if(!match && uniques.Contains(words1[i]))
        { 
            uniques.Add(words1[i]);
        }
        { 
        uniques.Add(words1[i]);
        }
    }

Чтобы сделать ваш код еще короче, вы можете использовать LINQ

List<string> Unique(string lines1 ,string lines2,  char[] separators)
{    
string[] words1 = lines1.Split(separators, StringSplitOptions.RemoveEmptyEntries);
string[] words2 = lines2.Split(separators, StringSplitOptions.RemoveEmptyEntries);
return words1.Except(words2).ToList();
}
...