Как я удаляю дубликаты из массива C#?

Как отметил @FelixKling, наиболее вероятным сценарием является то, что узлы, которые вы ищете, еще не существуют.

Однако современные методы разработки часто могут манипулировать элементами документа за пределами дерева документов либо с DocumentFragments, либо просто отсоединением / повторным подключением текущих элементов напрямую. Такие методы могут использоваться как часть шаблонов JavaScript или для предотвращения чрезмерных операций перерисовки / переплавки, в то время как элементы, о которых идет речь, сильно изменяются.

Аналогично, новая функциональность «Теневой DOM» развертывается в современных браузерах позволяет элементам быть частью документа, но не обрабатываться запросом document.getElementById и всеми его методами sibling (querySelector и т. д.). Это делается для инкапсуляции функциональных возможностей и, в частности, скрыть его.

Опять же, скорее всего, элемент, который вы ищете, просто (пока) в документе, и вы должны сделать, как предлагает Феликс , Тем не менее, вы также должны знать, что это все чаще является не единственной причиной того, что элемент может быть необоснованным (временно или постоянно).

200
задан Stevoisiak supports Monica 26 September 2017 в 09:21
поделиться

11 ответов

Вы могли возможно использовать запрос LINQ, чтобы сделать это:

int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();
415
ответ дан Jeff Atwood 23 November 2019 в 05:05
поделиться

ПРИМЕЧАНИЕ: НЕ протестированный!

string[] test(string[] myStringArray)
{
    List<String> myStringList = new List<string>();
    foreach (string s in myStringArray)
    {
        if (!myStringList.Contains(s))
        {
            myStringList.Add(s);
        }
    }
    return myStringList.ToString();
}

Мог бы сделать то, в чем Вы нуждаетесь...

РЕДАКТИРОВАНИЕ Argh!!! избитый к нему грабят менее чем на минуту!

4
ответ дан ZombieSheep 23 November 2019 в 05:05
поделиться
List<String> myStringList = new List<string>();
foreach (string s in myStringArray)
{
    if (!myStringList.Contains(s))
    {
        myStringList.Add(s);
    }
}

Это O (n^2) , который не будет иметь значения для короткого списка, который будет наполненным в комбинацию, но мог быть быстро быть проблемой на большом наборе.

7
ответ дан Chandan Kumar 23 November 2019 в 05:05
поделиться

Добавьте все строки к словарю и получите свойство Keys впоследствии. Это произведет каждую уникальную строку, но не обязательно в том же порядке, в котором Ваш исходный вход имел их.

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

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

В конце, список содержит первое происшествие каждой уникальной строки.

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

5
ответ дан angry person 23 November 2019 в 05:05
поделиться

Следующий протестированный и рабочий код удалит дубликаты из массива. Необходимо включать Систему. Пространство имен наборов.

string[] sArray = {"a", "b", "b", "c", "c", "d", "e", "f", "f"};
var sList = new ArrayList();

for (int i = 0; i < sArray.Length; i++) {
    if (sList.Contains(sArray[i]) == false) {
        sList.Add(sArray[i]);
    }
}

var sNew = sList.ToArray();

for (int i = 0; i < sNew.Length; i++) {
    Console.Write(sNew[i]);
}

Вы могли обернуть это в функцию, если бы Вы хотели.

10
ответ дан GateKiller 23 November 2019 в 05:05
поделиться

Это могло бы зависеть от того, насколько Вы хотите спроектировать решение - если массив никогда не будет этим большим, и Вы не заботитесь о сортировке списка, Вы могли бы хотеть попробовать что-то подобное следующему:

    public string[] RemoveDuplicates(string[] myList) {
        System.Collections.ArrayList newList = new System.Collections.ArrayList();

        foreach (string str in myList)
            if (!newList.Contains(str))
                newList.Add(str);
        return (string[])newList.ToArray(typeof(string));
    }
9
ответ дан rjzii 23 November 2019 в 05:05
поделиться

Если бы необходимо было отсортировать его, то Вы могли реализовать вид, который также удаляет дубликаты.

Уничтожает двух птиц с одним камнем, тогда.

11
ответ дан Matthew Schinckel 23 November 2019 в 05:05
поделиться

Вот HashSet< string> подход:

public static string[] RemoveDuplicates(string[] s)
{
    HashSet<string> set = new HashSet<string>(s);
    string[] result = new string[set.Count];
    set.CopyTo(result);
    return result;
}

, К сожалению, это решение также требует платформы.NET 3.5 или позже поскольку HashSet не был добавлен до той версии. Вы могли также использовать массив. Отличный () , который является функцией LINQ.

52
ответ дан Fr33dan 23 November 2019 в 05:05
поделиться
strINvalues = "1,1,2,2,3,3,4,4";
strINvalues = string.Join(",", strINvalues .Split(',').Distinct().ToArray());
Debug.Writeline(strINvalues);

KKK, Не уверенный, если это - колдовство или просто красивый код

1 strINvalues.Split ('').Distinct ().ToArray ()

2 строка. Соединение ("", XXX);

1 Разделение массива и использование Отличного [LINQ] для удаления дубликатов 2 Присоединение к нему назад без дубликатов.

Жаль я никогда не читал текст на StackOverFlow просто код. это имеет больше смысла, чем текст ;)

0
ответ дан 23 November 2019 в 05:05
поделиться

Вот подход O (n * n) , который использует пробел O (1) .

void removeDuplicates(char* strIn)
{
    int numDups = 0, prevIndex = 0;
    if(NULL != strIn && *strIn != '\0')
    {
        int len = strlen(strIn);
        for(int i = 0; i < len; i++)
        {
            bool foundDup = false;
            for(int j = 0; j < i; j++)
            {
                if(strIn[j] == strIn[i])
                {
                    foundDup = true;
                    numDups++;
                    break;
                }
            }

            if(foundDup == false)
            {
                strIn[prevIndex] = strIn[i];
                prevIndex++;
            }
        }

        strIn[len-numDups] = '\0';
    }
}

Приведенные выше подходы hash / linq - это то, что вы обычно используете в реальной жизни. Однако на собеседовании они обычно хотят ввести некоторые ограничения, например, постоянное пространство, которое исключает хэш или отсутствие внутреннего api - что исключает использование LINQ .

6
ответ дан 23 November 2019 в 05:05
поделиться

Следующий фрагмент кода пытается удалить дубликаты из ArrayList, хотя это не оптимальное решение. Мне задали этот вопрос во время интервью, чтобы удалить дубликаты с помощью рекурсии и без использования второго / временного arrayylist:

private void RemoveDuplicate() 
{

ArrayList dataArray = new ArrayList(5);

            dataArray.Add("1");
            dataArray.Add("1");
            dataArray.Add("6");
            dataArray.Add("6");
            dataArray.Add("6");
            dataArray.Add("3");
            dataArray.Add("6");
            dataArray.Add("4");
            dataArray.Add("5");
            dataArray.Add("4");
            dataArray.Add("1");

            dataArray.Sort();

            GetDistinctArrayList(dataArray, 0);
}

private void GetDistinctArrayList(ArrayList arr, int idx)

{

            int count = 0;

            if (idx >= arr.Count) return;

            string val = arr[idx].ToString();
            foreach (String s in arr)
            {
                if (s.Equals(arr[idx]))
                {
                    count++;
                }
            }

            if (count > 1)
            {
                arr.Remove(val);
                GetDistinctArrayList(arr, idx);
            }
            else
            {
                idx += 1;
                GetDistinctArrayList(arr, idx);
            }
        }
5
ответ дан 23 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: