2014-10-05 21 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