Удалить избыточную строку из строки массива - PullRequest
0 голосов
/ 08 января 2020

Я хочу удалить существующую строку, содержащуюся в массиве строк. Например:

строковый массив содержит:

string [] arra = new string[] {"Financial banking", "mobile application", "customer account opening", "financial", "banking", "mobile", "application", "account banking"};

Требуемый результат как:

string [] result = new string[] {"Financial banking", "mobile application", "customer account opening"}

Хотите удалить:

financial, banking, mobile, application, account banking 

Как эти строка уже присутствует в строковом массиве

Я пробовал ниже код:

string [] arra = new string[] {"Financial banking", "mobile application", "customer account opening", "financial", "banking", "mobile", "application", "account banking"};
string [] arrb = new string[] {"Financial banking", "mobile application", "customer account opening", "financial", "banking", "mobile", "application", "account banking"};
List<string> resultarr = new List<string>();

foreach(var arralist in arra){
    foreach(var arrblist in arrb){
        if(!arralist.Contains(arrblist) && !resultarr.Contains(arrblist)){
            resultarr.Add(arrblist);
            Console.WriteLine(arrblist);
        }
    }
}

Но это не возвращает желаемый результат. Любая помощь в этом.

Ответы [ 3 ]

4 голосов
/ 08 января 2020

Я предполагаю, что ваш алгоритм:

  1. Разбейте каждый элемент в вашем входе на слова (разделенные пробелами)
  2. Если мы видели все эти слова раньше (без учета регистра), затем проигнорируйте этот элемент
  3. В противном случае добавьте этот элемент в вывод и запомните все эти слова

Это приведет к ожидаемому результату, но это может быть Стоит уточнить ваш алгоритм в вашем вопросе.

Если это правильно, вы можете сделать что-то вроде этого:

var input = new string[] {"Financial banking", "mobile application", "customer account opening", "financial", "banking", "mobile", "application", "account banking"};
var wordsSeen = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
var result = new List<string>();

foreach (var item in input)
{
    var words = item.Split(' ');

    // If all of the elements in 'words' are present in 'wordsSeen', ignore this item
    if (wordsSeen.IsProperSupersetOf(words))
        continue;

    result.Add(item);

    // Add all of these words to 'seen'
    wordsSeen.UnionWith(words);
}

Мы используем HashSet<string> для записи слова, которые мы видели, и мы говорим ему использовать компаратор StringComparer.InvariantCultureIgnoreCase при сравнении слов, поэтому он скажет, что два слова одинаковы, даже если они используют разные регистры. (Вы можете использовать StringComparer.CurrentCultureIgnoreCase или StringComparer.OrdinalIgnoreCase здесь.)

0 голосов
/ 08 января 2020

Если ваша единственная цель - удалить избыточные элементы. Затем вы можете попробовать это:

string [] arra = new string[] {"Financial banking", "mobile application", "customer account opening", "financial", "banking", "mobile", "application", "account banking"};
var elementsToRemove = new string[]{"financial", "banking", "mobile", "application", "account banking"};
var newArray = arra.Except(elementsToRemove).ToArray(); 

Вам потребуется ввести пространство имен System.Ling для доступа к методу Except.

0 голосов
/ 08 января 2020

А как насчет метода Distinct:

var result = arra.Distinct(new DistinctItemComparer()).ToArray();

Однако для этой цели вам также может понадобиться пользовательский компаратор равенства.

public class DistinctItemComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        return y.ToLower().Split().Any(c => x.ToLower().Contains(c));
    }

    public int GetHashCode(string obj)
    {
        return 1;
    }
}

Смотрите результат здесь:

https://dotnetfiddle.net/FoC0C5

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