Как удалить дубликаты из массива C #?
292673 просмотра
23 ответа
Я работал с string[]
массивом в C #, который возвращается из вызова функции. Я мог бы привести к Generic
коллекции, но мне было интересно, есть ли лучший способ сделать это, возможно, с использованием временного массива.
Каков наилучший способ удалить дубликаты из массива C #?
Автор: lomaxx Источник Размещён: 11.11.2019 03:56Ответы (23)
412 плюса
Вы можете использовать запрос LINQ для этого:
int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();
Автор: Jeff Atwood
Размещён: 13.08.2008 12:03
52 плюса
Вот подход HashSet
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 Framework 3.5 или более поздняя версия, поскольку HashSet не был добавлен до этой версии. Вы также можете использовать array.Distinct () , которая является функцией LINQ.
Автор: Arcturus Размещён: 13.08.2008 01:5011 плюса
Если вам нужно было отсортировать его, вы можете реализовать сортировку, которая также удаляет дубликаты.
Тогда убивает двух зайцев.
Автор: Matthew Schinckel Размещён: 13.08.2008 11:5110 плюса
Следующий проверенный и работающий код удалит дубликаты из массива. Вы должны включить пространство имен System.Collections.
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]);
}
Вы можете обернуть это в функцию, если хотите.
Автор: GateKiller Размещён: 13.08.2008 01:049 плюса
Это может зависеть от того, насколько вы хотите спроектировать решение - если массив никогда не будет таким большим, и вы не заботитесь о сортировке списка, вы можете попробовать что-то похожее на следующее:
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));
}
Автор: rjzii
Размещён: 13.08.2008 01:08
7 плюса
- Это вопрос интервью, который задают каждый раз. Теперь я сделал свое кодирование.
static void Main(string[] args)
{
int[] array = new int[] { 4, 8, 4, 1, 1, 4, 8 };
int numDups = 0, prevIndex = 0;
for (int i = 0; i < array.Length; i++)
{
bool foundDup = false;
for (int j = 0; j < i; j++)
{
if (array[i] == array[j])
{
foundDup = true;
numDups++; // Increment means Count for Duplicate found in array.
break;
}
}
if (foundDup == false)
{
array[prevIndex] = array[i];
prevIndex++;
}
}
// Just Duplicate records replce by zero.
for (int k = 1; k <= numDups; k++)
{
array[array.Length - k] = '\0';
}
Console.WriteLine("Console program for Remove duplicates from array.");
Console.Read();
}
Автор: Muhammad Mubashir
Размещён: 03.07.2013 07:50
7 плюса
List<String> myStringList = new List<string>(); foreach (string s in myStringArray) { if (!myStringList.Contains(s)) { myStringList.Add(s); } }
Это O (n ^ 2) , что не имеет значения для короткого списка, который будет вставлен в комбо, но может быстро стать проблемой для большой коллекции.
Автор: Will Dean Размещён: 13.08.2008 02:196 плюса
protected void Page_Load(object sender, EventArgs e)
{
string a = "a;b;c;d;e;v";
string[] b = a.Split(';');
string[] c = b.Distinct().ToArray();
if (b.Length != c.Length)
{
for (int i = 0; i < b.Length; i++)
{
try
{
if (b[i].ToString() != c[i].ToString())
{
Response.Write("Found duplicate " + b[i].ToString());
return;
}
}
catch (Exception ex)
{
Response.Write("Found duplicate " + b[i].ToString());
return;
}
}
}
else
{
Response.Write("No duplicate ");
}
}
Автор: Pintu
Размещён: 14.02.2012 06:07
6 плюса
Вот подход 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 .
Автор: Sesh Размещён: 06.12.2009 05:505 плюса
Добавьте все строки в словарь и впоследствии получите свойство Keys. Это создаст каждую уникальную строку, но не обязательно в том же порядке, в котором они были в исходном вводе.
Если требуется, чтобы конечный результат имел тот же порядок, что и исходный ввод, при рассмотрении первого вхождения каждой строки используйте вместо этого следующий алгоритм:
- Есть список (окончательный вывод) и словарь (для проверки на дубликаты)
- Для каждой строки во входе проверьте, существует ли она уже в словаре
- Если нет, добавьте его как в словарь, так и в список.
В конце список содержит первое вхождение каждой уникальной строки.
Убедитесь, что вы учитываете такие вещи, как культура и тому подобное, при создании словаря, чтобы убедиться, что вы правильно обрабатываете дубликаты с акцентированными буквами.
Автор: angry person Размещён: 13.08.2008 12:535 плюса
Следующий фрагмент кода пытается удалить дубликаты из ArrayList, хотя это не является оптимальным решением. Мне задали этот вопрос во время интервью, чтобы удалить дубликаты путем рекурсии и без использования второго / временного архива:
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);
}
}
Автор: Vijay Swami
Размещён: 15.04.2010 09:31
5 плюса
Простое решение:
using System.Linq;
...
public static int[] Distinct(int[] handles)
{
return handles.ToList().Distinct().ToArray();
}
Автор: Fábio Delboni
Размещён: 12.03.2015 09:21
5 плюса
Может быть, hashset, который не хранит дублирующиеся элементы и молча игнорирует запросы на добавление дубликатов.
static void Main()
{
string textWithDuplicates = "aaabbcccggg";
Console.WriteLine(textWithDuplicates.Count());
var letters = new HashSet<char>(textWithDuplicates);
Console.WriteLine(letters.Count());
foreach (char c in letters) Console.Write(c);
Console.WriteLine("");
int[] array = new int[] { 12, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 };
Console.WriteLine(array.Count());
var distinctArray = new HashSet<int>(array);
Console.WriteLine(distinctArray.Count());
foreach (int i in distinctArray) Console.Write(i + ",");
}
Автор: lukaszk
Размещён: 21.12.2012 08:33
4 плюса
ПРИМЕЧАНИЕ: НЕ проверено!
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 !!! избили его грабителем менее чем за минуту!
Автор: ZombieSheep Размещён: 13.08.2008 01:094 плюса
Протестировано ниже, и это работает. Что круто, так это то, что он делает поиск с учетом культуры тоже
class RemoveDuplicatesInString
{
public static String RemoveDups(String origString)
{
String outString = null;
int readIndex = 0;
CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;
if(String.IsNullOrEmpty(origString))
{
return outString;
}
foreach (var ch in origString)
{
if (readIndex == 0)
{
outString = String.Concat(ch);
readIndex++;
continue;
}
if (ci.IndexOf(origString, ch.ToString().ToLower(), 0, readIndex) == -1)
{
//Unique char as this char wasn't found earlier.
outString = String.Concat(outString, ch);
}
readIndex++;
}
return outString;
}
static void Main(string[] args)
{
String inputString = "aAbcefc";
String outputString;
outputString = RemoveDups(inputString);
Console.WriteLine(outputString);
}
}
--AptSenSDET
Автор: AptSenSDET Размещён: 15.06.2013 07:184 плюса
Этот код на 100% удаляет повторяющиеся значения из массива [как я использовал [i]] ..... Вы можете конвертировать его на любом языке OO ..... :)
for(int i=0;i<size;i++)
{
for(int j=i+1;j<size;j++)
{
if(a[i] == a[j])
{
for(int k=j;k<size;k++)
{
a[k]=a[k+1];
}
j--;
size--;
}
}
}
Автор: Salman Ramzan
Размещён: 05.07.2014 02:14
3 плюса
Общий метод расширения:
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
HashSet<TSource> set = new HashSet<TSource>(comparer);
foreach (TSource item in source)
{
if (set.Add(item))
{
yield return item;
}
}
}
Автор: Ali Bayat
Размещён: 13.10.2018 04:32
1 плюс
Вы можете использовать этот код при работе с ArrayList
ArrayList arrayList;
//Add some Members :)
arrayList.Add("ali");
arrayList.Add("hadi");
arrayList.Add("ali");
//Remove duplicates from array
for (int i = 0; i < arrayList.Count; i++)
{
for (int j = i + 1; j < arrayList.Count ; j++)
if (arrayList[i].ToString() == arrayList[j].ToString())
arrayList.Remove(arrayList[j]);
Автор: reza akhlaghi
Размещён: 12.04.2015 09:12
1 плюс
public static int RemoveDuplicates(ref int[] array)
{
int size = array.Length;
// if 0 or 1, return 0 or 1:
if (size < 2) {
return size;
}
int current = 0;
for (int candidate = 1; candidate < size; ++candidate) {
if (array[current] != array[candidate]) {
array[++current] = array[candidate];
}
}
// index to count conversion:
return ++current;
}
Автор: Harry Martyrossian
Размещён: 02.02.2016 05:21
0 плюса
Ниже приведена простая логика в Java, когда вы дважды просматриваете элементы массива, и если вы видите какой-либо элемент, вы присваиваете ему ноль, плюс вы не касаетесь индекса сравниваемого элемента.
import java.util.*;
class removeDuplicate{
int [] y ;
public removeDuplicate(int[] array){
y=array;
for(int b=0;b<y.length;b++){
int temp = y[b];
for(int v=0;v<y.length;v++){
if( b!=v && temp==y[v]){
y[v]=0;
}
}
}
}
Автор: Papasani Mohansrinivas
Размещён: 05.10.2016 08:14
0 плюса
private static string[] distinct(string[] inputArray)
{
bool alreadyExists;
string[] outputArray = new string[] {};
for (int i = 0; i < inputArray.Length; i++)
{
alreadyExists = false;
for (int j = 0; j < outputArray.Length; j++)
{
if (inputArray[i] == outputArray[j])
alreadyExists = true;
}
if (alreadyExists==false)
{
Array.Resize<string>(ref outputArray, outputArray.Length + 1);
outputArray[outputArray.Length-1] = inputArray[i];
}
}
return outputArray;
}
Автор: Arie Yehieli
Размещён: 30.11.2017 08:03
0 плюса
using System;
using System.Collections.Generic;
using System.Linq;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
List<int> listofint1 = new List<int> { 4, 8, 4, 1, 1, 4, 8 };
List<int> updatedlist= removeduplicate(listofint1);
foreach(int num in updatedlist)
Console.WriteLine(num);
}
public static List<int> removeduplicate(List<int> listofint)
{
List<int> listofintwithoutduplicate= new List<int>();
foreach(var num in listofint)
{
if(!listofintwithoutduplicate.Any(p=>p==num))
{
listofintwithoutduplicate.Add(num);
}
}
return listofintwithoutduplicate;
}
}
}
Автор: Rohan
Размещён: 25.04.2019 05:28
0 плюса
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 string.Join (",", XXX);
1 Разделение массива и использование Distinct [LINQ] для удаления дубликатов 2 Присоединение к нему без дубликатов.
Извините, я никогда не читал текст на StackOverFlow только код. это имеет больше смысла, чем текст;)
Автор: Kudakwashe Mafutah Размещён: 03.10.2019 04:23Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- arrays Как удалить дубликаты из массива C #?
- arrays Как определить размер моего массива в C?
- arrays Каков наилучший способ конвертировать массив в хеш в Ruby
- arrays Сравнение двухбайтовых массивов в .NET
- arrays Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?
- arrays Haxe итерация на динамическом
- duplicates Как я могу удалить дубликаты строк?
- duplicates Удалить дубликаты из списка <T> в C #
- duplicates Как удалить повторяющиеся элементы из ArrayList?
- duplicates Дублирование экземпляров модели и связанных с ними объектов в Django / Algorithm для повторного дублирования объекта
- duplicates Как вы удаляете дубликаты из списка, сохраняя порядок?