如何从C#数组中删除重复项?

我一直在C#中的一个string[]数组,从函数调用返回。 我可能会投到一个Generic集合,但我想知道是否有更好的方法来做到这一点,可能通过使用临时数组。

什么是从C#数组中删除重复的最佳方法?

你可以使用LINQ查询来做到这一点:

 int[] s = { 1, 2, 3, 3, 4}; int[] q = s.Distinct().ToArray(); 

这里是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 Framework 3.5或更高版本,因为HashSet直到该版本才被添加。 你也可以使用array.Distinct() ,这是LINQ的一个特性。

如果你需要排序,那么你可以实现一个排序,也可以删除重复。

然后用一块石头杀死两只鸟。

这可能取决于你想要设计解决方案的数量 – 如果数组永远不会很大,而且你不关心排序列表,你可能想尝试类似于以下内容:

  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)); } 

以下测试和工作代码将删除数组中的重复项。 您必须包含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]); } 

如果你愿意的话,你可以把它包装成一个函数。

– 这是面试问题,每次问。 现在我完成了它的编码。

 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(); } 
 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 "); } } 

下面这段代码尝试从ArrayList中删除重复项,尽管这不是一个最佳的解决方案。 在面试中,我被问到这个问题,通过递归删除重复,而不使用第二个/临时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); } } 

也许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 + ","); } 
 List<String> myStringList = new List<string>(); foreach (string s in myStringArray) { if (!myStringList.Contains(s)) { myStringList.Add(s); } } 

这是O(n ^ 2) ,这对于一个将被塞进一个组合中的短名单来说并不重要,但是可能很快成为大集合中的一个问题。

将所有字符串添加到字典中,然后获取Keys属性。 这将产生每个唯一的字符串,但不一定按照原始输入的相同顺序。

如果您要求最终结果与原始输入具有相同的顺序,那么当您考虑每个字符串的首次出现时,请改用以下算法:

  1. 有一个列表(最终输出)和一个字典(检查重复)
  2. 对于输入中的每个字符串,检查它是否已经存在于字典中
  3. 如果没有,则将其添加到词典和列表中

最后,列表包含每个唯一字符串的第一个出现。

确保在构建字典时考虑文化等因素,确保正确处理重音字母的重复。

测试下面&它的作品。 最酷的是它也对文化敏感的搜索

 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

这是一个使用O(1)空间的O(n * n)方法。

 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

注意:未经测试!

 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(); } 

可能做你需要的…

编辑啊! 一分钟之内被抢劫殴打!

这段代码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--; } } } 

简单的方案:

 using System.Linq; ... public static int[] Distinct(int[] handles) { return handles.ToList().Distinct().ToArray(); } 

你可以在使用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]); 
 public static int RemoveDuplicates(ref int[] array) { int i = 0; int n = array.Length; if (n > 0) { int v = array[0]; for (int j = 1; j < n; ++j) { if (v != array[j]) { v = array[++i] = array[j]; } } // Index to number: ++i; } return i; } 

下面是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; } } } }