C# - Найти, если указанное значение c имеет дубликат в списке - PullRequest
0 голосов
/ 12 марта 2020

У меня есть случай использования, когда, учитывая огромный список строк и одно заданное c строковое значение, извлеченное из строки DataGridView, содержащей те же элементы в том же порядке, мне нужно найти, если список содержит другой идентичный запись. Все существующие сообщения, которые я проверил, просто сообщают вам, если есть период дубликатов. Вот что у меня есть:

List<int> indexes = new List<int>{-1, originalRow.Index};

int foundIndex = CompleteScancodeList.IndexOf(originalRow.Cells[1].Value.ToString());

if (!indexes.Contains(foundIndex))
{
    //Do something
}

Переменная originalRow - это DataGridViewRow, которая извлекается из итерации по каждой строке DataGridView. Здесь я эффективно говорю: если индекс этого элемента в списке не равен -1 и не совпадает с индексом строки (следовательно, буквально тот же элемент).

Мне изначально удалось заставить его работать с вложенным l oop, но это было слишком медленно для моего вкуса. Как я могу заставить эту работу работать так, как я хочу, чтобы это условие оценивалось как истинное, только если данное строковое значение присутствует в списке строк, но по индексу, отличному от исходного?

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

Ответы [ 4 ]

1 голос
/ 12 марта 2020

Я с телефона, извините за ужасное форматирование и опечатки. Итак, скажите, если в списке есть дубликаты:

if (list.Count != list.Distinct().Count) { // list has dupes }

Найдите конкретные дубликаты и обработайте их:

var set = new HasSet<int>();
foreach (var item in list) {
    if (!set.Add(item)) {
        // handle it
    }
}

Вы можете заменить foreach на l oop, если вам нужны фактические индексы в массиве .

0 голосов
/ 12 марта 2020

это пример того, как найти повторяющиеся числа в списке и сохранить уникальные значения, выбранные из первого списка, во второй список

            List<int> LST = new List<int> { 10, 34, 43, 75, 10, 67, 30, 200, 30, 100, 30 };
        List<int> LST_2 = new List<int>();

        for (int i = 0; i < LST.Count; i++)
        {
            for (int j = i + 1; j < LST.Count; j++)
            {
                if (LST[j] == LST[i])
                {

                    if (!LST_2.Contains(LST[i]))
                    {
                        LST_2.Add(LST[i]);
                    }

                }
            }
        }

        foreach (var N in LST_2)
        {
            Console.WriteLine(N);
        }

i wi sh это поможет вам

0 голосов
/ 12 марта 2020

Получив первый индекс искомого значения:

string searchedValue = originalRow.Cells[1].Value.ToString();
int foundIndex = CompleteScancodeList.IndexOf(searchedValue);

Вы можете использовать метод linq .Skip(), чтобы получить только остальные элементы. Затем используйте .Any(), который прекратит выполнение после выполнения условия.

CompleteScancodeList.Skip(foundIndex).Any(entry => entry == searchedValue);

Но он все еще повторяется дважды, один раз для IndexOf и один раз для Any.

0 голосов
/ 12 марта 2020
//Search the index of first element
int foundIndex = CompleteScancodeList.IndexOf(originalRow.Cells[1].Value.ToString());
//If the index found is row's index
if(foundIndex == originalRow.Index)
    //Search the index of next element
    foundIndex = CompleteScancodeList.IndexOf(originalRow.Cells[1].Value.ToString(), originalRow.Index + 1);

//If something is found
if (foundIndex != -1)
{
    //Do something
}

Другое решение с явным l oop:

var hasDuplicate = false;
var index = 0;
foreach(var element in CompleteScancodeList)
{
    if(element == originalRow.Cells[1].Value.ToString() && index != originalRow.Index)
    {
        hasDuplicate = true;
        break;
    }
    index++;
}

if (hasDuplicate)
{
    //Do something
}

...