Как отметил @FelixKling, наиболее вероятным сценарием является то, что узлы, которые вы ищете, еще не существуют.
Однако современные методы разработки часто могут манипулировать элементами документа за пределами дерева документов либо с DocumentFragments, либо просто отсоединением / повторным подключением текущих элементов напрямую. Такие методы могут использоваться как часть шаблонов JavaScript или для предотвращения чрезмерных операций перерисовки / переплавки, в то время как элементы, о которых идет речь, сильно изменяются.
Аналогично, новая функциональность «Теневой DOM» развертывается в современных браузерах позволяет элементам быть частью документа, но не обрабатываться запросом document.getElementById и всеми его методами sibling (querySelector и т. д.). Это делается для инкапсуляции функциональных возможностей и, в частности, скрыть его.
Опять же, скорее всего, элемент, который вы ищете, просто (пока) в документе, и вы должны сделать, как предлагает Феликс , Тем не менее, вы также должны знать, что это все чаще является не единственной причиной того, что элемент может быть необоснованным (временно или постоянно).
Вы могли возможно использовать запрос LINQ, чтобы сделать это:
int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();
ПРИМЕЧАНИЕ: НЕ протестированный!
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!!! избитый к нему грабят менее чем на минуту!
List<String> myStringList = new List<string>(); foreach (string s in myStringArray) { if (!myStringList.Contains(s)) { myStringList.Add(s); } }
Это O (n^2) , который не будет иметь значения для короткого списка, который будет наполненным в комбинацию, но мог быть быстро быть проблемой на большом наборе.
Добавьте все строки к словарю и получите свойство Keys впоследствии. Это произведет каждую уникальную строку, но не обязательно в том же порядке, в котором Ваш исходный вход имел их.
, Если Вы требуете конечного результата иметь тот же порядок как исходный вход, когда Вы рассматриваете первое происшествие каждой строки, используют следующий алгоритм вместо этого:
В конце, список содержит первое происшествие каждой уникальной строки.
Удостоверяются, что Вы рассматриваете вещи как культура и такой при построении словаря, чтобы удостовериться, что Вы обрабатываете дубликаты с буквами с диакритическим знаком правильно.
Следующий протестированный и рабочий код удалит дубликаты из массива. Необходимо включать Систему. Пространство имен наборов.
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]);
}
Вы могли обернуть это в функцию, если бы Вы хотели.
Это могло бы зависеть от того, насколько Вы хотите спроектировать решение - если массив никогда не будет этим большим, и Вы не заботитесь о сортировке списка, Вы могли бы хотеть попробовать что-то подобное следующему:
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));
}
Если бы необходимо было отсортировать его, то Вы могли реализовать вид, который также удаляет дубликаты.
Уничтожает двух птиц с одним камнем, тогда.
Вот 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.
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 просто код. это имеет больше смысла, чем текст ;)
Вот подход 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 .
Следующий фрагмент кода пытается удалить дубликаты из 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);
}
}