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

时间:2020-03-05 18:39:21  来源:igfitidea点击:

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

从Carray中删除重复项的最佳方法是什么?

解决方案

回答

如果我们需要对它进行排序,则可以实施一种排序,该操作还可以删除重复项。

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

回答

我们可以使用LINQ查询来执行此操作:

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

回答

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

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

  • 有一个列表(最终输出)和一个字典(检查重复项)
  • 对于输入中的每个字符串,检查它是否已存在于字典中
  • 如果不是,请将其添加到字典和列表中

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

在构建字典时,请确保考虑诸如文化之类的问题,以确保正确处理带重音字母的重复项。

回答

以下经过测试且有效的代码将从数组中删除重复项。我们必须包括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]);
}

如果需要,可以将其包装为一个函数。

回答

如果阵列永远不会那么大,并且我们不关心对列表进行排序,那么这可能取决于我们要设计解决方案的量,我们可能想尝试类似于以下内容的方法:

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

回答

注意:未经测试!

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

可能会做我们需要的...

编辑啊!不到一分钟就被抢劫殴打了!

回答

这是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的功能。

回答

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

这是O(n ^ 2),对于将要填充到组合中的简短列表来说无关紧要,但是对于大集合而言可能会很快成为问题。

回答

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

void removeDuplicates(char* strIn)
{
    int numDups = 0, prevIndex = 0;
    if(NULL != strIn && *strIn != '
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);
            }
        }
') { 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] = '##代码##'; } }

上面的hash / linq方法是我们在现实生活中通常会使用的方法。但是在面试中,他们通常想施加一些限制,例如排除哈希的常量空间,或者没有使用LINQ排除的内部api。

回答

下面的代码尝试从ArrayList中删除重复项,尽管这不是最佳解决方案。在面试中有人问我这个问题,以便通过递归删除重复项,而无需使用第二/临时数组列表:

##代码##