从c#中的数组中删除类似的字符串

时间:2014-10-05 17:04:32

标签: c# arrays

假设我有以下字符串数组:

string[] array = new string[6];

array[0] = "http://www.s8wministries.org/general.php?id=35";
array[1] = "http://www.s8wministries.org/general.php?id=52";
array[2] = "http://www.ecogybiofuels.com/general.php?id=6";
array[3] = "http://www.stjohnsheriff.com/general.php?id=186";
array[4] = "http://www.stjohnsheriff.com/general.php?id=7";
array[5] = "http://www.bickellawfirm.com/general.php?id=1048";

现在我想只存储一个类似的字符串,即http://www.s8wministries.org/general.php?id=35,丢弃任何其他具有http://www.s8wministries.org的字符串并将其存储在另一个数组中。

请问我该怎么做?

我的尝试如下: -

//从数组中删除类似的字符串,只在另一个数组中存储一个相似的

        foreach (var olu in array)
        {

            string findThisString = olu.ToString();
            string firstTen = findThisString.Substring(0, 15); 

            // See if substring is in the table.
            int index1 = Array.IndexOf(array, firstTen);  //substring is not in table

        }

5 个答案:

答案 0 :(得分:0)

以下是我将如何处理此问题

  1. 初始化哈希表或字典以保存域名
  2. 遍历每个项目
  3. 使用'','。','/'等作为分隔符进行字符串拆分操作 - 通过解析部分找出域。
  4. 检查哈希表中是否存在域名。如果是,则丢弃当前条目。如果它不存在,请插入哈希表,并将当前条目添加到所选条目的新列表中。
  5. 另一种选择是按字母顺序对条目进行排序。一次一个地浏览它们。选择包含域名的条目。使用相同的域名跳过所有下一个条目。当域名再次更改时,请选择下一个条目。

答案 1 :(得分:0)

假设结果存储在名为unique_array的数组中,并且当前数组名为array。伪代码如下:

bool found = false;
for(int i = 0; i < array_size; i++)
{   if(array[i] starts with "http://www.s8wministries.org")
    {   if(found) continue;
        found = true;
    }
    add array[i] to end of unique_array;
}

答案 2 :(得分:0)

尝试使用List of string,因此您有包含URL的字符串列表,您可以使用URI类来比较域:

for(int i = 0; i < strList.Length; i++)
{   
  Uri uriToCompare = new Uri(strArray[i]);
  for(int j = i+1; j < strArray.Length; j++){
     Uri uri = new Uri(strArray[j]);
     if( uriToCompare.Host  == uri.Host){
        strList.RemoveAt(j);
     }     
  }
}

答案 3 :(得分:0)

通过创建一个继承IEqualityComparer的类(利用this question的优秀答案),我会采用稍微更自动化的方式:

public class PropertyComparer<T> : IEqualityComparer<T>
{
    Func<T, T, bool> comparer;

    public PropertyComparer<T>(Func<T, T, bool> comparer)
    {
        this.comparer = comparer;
    }

    public bool Equals(T a, T b)
    {
        return comparer(a, b);
    }

    public int GetHashCode(T a)
    {
        return a.GetHashCode();
    }
}

一旦你上课了 - 你就可以像这样使用Distinct:

var distinctArray = array.Select(s => new Uri(s)).Distinct(new PropertyComparer<Uri>((a, b) => a.Host == b.Host));

这会留下一个只包含不同域的数组。它是一个IEnumerable,因此您可能需要.ToList()它或其他内容,或者将其从string恢复为Uri s。但我认为这种方法可以实现更易读的代码。

答案 4 :(得分:0)

请尝试以下代码:

    string[] array = new string[6];
    array[0] = "http://www.s8wministries.org/general.php?id=35";
    array[1] = "http://www.s8wministries.org/general.php?id=52";
    array[2] = "http://www.ecogybiofuels.com/general.php?id=6";
    array[3] = "http://www.stjohnsheriff.com/general.php?id=186";
    array[4] = "http://www.stjohnsheriff.com/general.php?id=7";
    array[5] = "http://www.bickellawfirm.com/general.php?id=1048";
    var regex = @"http://www.[\w]+.[\w]+";
    var distList = new List<string>();
    var finalList = new List<string>();
    foreach (string str in array)
    {
        Match match = Regex.Match(str, regex, RegexOptions.IgnoreCase);
        if (match.Success)
        {
            var uniqueUrl = match.Groups[0].Value;
            if (!distList.Contains(uniqueUrl))
            {
                distList.Add(uniqueUrl);
                finalList.Add(str);
            }
        }
    }

此处finalList包含所需的URL列表