2014-10-05 26 views
-2

假设我有一个字符串数组如下:从阵列中去除相似的弦在C#

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 

     } 
+0

的名单我想你已经抬头了如何使用[子](HTTP://计算器。COM /问题/ 2902394 /如何到获得最子式-C)?你能告诉我们你做了什么样的尝试以及你被卡住了吗? – Krease 2014-10-05 17:07:50

+0

使用子串不工作。看看这个我的尝试: -//删除类似的数组。 string firstTen = findThisString.Substring(0,15); //查看字符串是否在表格中。 int index1 = Array.IndexOf(array,firstTen); } – 2014-10-05 17:12:20

+0

最好将您的代码添加到问题而不是评论 - 使其更容易阅读:) – Krease 2014-10-05 17:15:37

回答

0

与字符串列表试试这个,所以你必须包含字符串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); 
    }  
    } 
} 
+0

你提倡的这种方法,它会区分网址: - http://www.s8wministries.org/general.php?id=35从http://www.s8wministries.org/general.php?id=52存储前url并丢弃后者 – 2014-10-05 17:40:27

+0

主机属性将比较's8wministries.org'。试试看msdn给出的链接。 – 2014-10-05 18:24:02

+0

你的代码就像魔术一样工作。尊重你! – 2014-10-06 03:04:41

0

这是我会怎么处理这

  1. 初始化散列表或字典用于保存域名
  2. 循环遍历每个项目
  3. 使用'','。','/'等作为分隔符执行字符串拆分操作 - 通过解析部分找出域。
  4. 检查散列表中是否存在域名。如果是,则丢弃当前条目。如果它不存在,则插入哈希表,并将当前条目添加到所选条目的新列表中。

另一种选择是按字母顺序排序条目。一次检查一个。选择一个带有域名的条目。跳过所有具有相同域名的条目。当域名再次更改时选择下一个条目。

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; 
} 
+0

会给你的伪代码一个试验,并给你update.i仍然需要更多的头脑风暴虽然 – 2014-10-05 17:25:48

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

一旦你的类 - 你可以使用不同的像这样:

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

这给你一个只包含不同域的数组。这是一个IEnumerable,因此您可能需要.ToList()它或其他东西,或从Uri s恢复为string。但我认为这种方法可以获得更多可读代码。

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

+0

您的方法可行,但我需要完整的网址,如http://www.s8wministries.org/general.php?id=35而不是www.s8wministries.org.If只有您可以请帮我修改代码显示完整的url.Thanks提前 – 2014-10-06 02:22:49