2012-01-06 263 views
1

我收到了對象列表(ip,domainname)。並希望在其中找到重複項,並刪除域名前沒有www的項目。刪除列表中的重複項

所以如果是在列表中

192.168.0.0 www.stackoverflow.com 
192.168.0.1 stackoverflow.com 

我想刪除stackoverflow.com。

到目前爲止,這是我的代碼,我通過我的對象列表這個功能:

static List<ServerBindings> removeDuplicates(List<ServerBindings> inputList) 
     { 
      Dictionary<string, string> uniqueStore = new Dictionary<string, string>(); 
      List<ServerBindings> finalList = new List<ServerBindings>(); 
      foreach (var currValue in inputList) 
      { 
       if (!uniqueStore.ContainsKey(currValue.DomainName)) 
       { 
         uniqueStore.Add(currValue.DomainName, currValue.IPAddress); 
         finalList.Add(new ServerBindings { DomainName = uniqueStore.Keys.ToString(), IPAddress = uniqueStore.Values.ToString() }); 
       } 
      } 

      return finalList; 
     } 

我試圖LINQ但作爲進出口新的它,我試圖GROUPBY,但不知道怎麼說選擇那些它在域名前面有www。

編輯:::

再次測試此,似乎不工作...我的意思是LINQ查詢只選擇有WWW在前面的人,忽略了那些沒有....澄清如果在列表中,我們有www.test.com,test.com和test3.com最終的結果應該是www.test.com和test3.com

+1

這就是你如何使用linq **刪除列表中的重複項[1]。 [1]:http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq – 2012-01-06 17:38:21

+0

重複http://stackoverflow.com/questions/1606679/remove -duplicates-the-list-using-linq – 2012-01-06 17:41:04

+0

你能澄清一下你在這裏想要的嗎?如果你有名單stackoverflow.com但不是www.stackoverflow.com你想要算法添加在www.stackoverflow.com並使用它? – 2012-01-07 08:21:03

回答

2
var result=inputList.Where(x=>x.DomainName.StartsWith("www.")).Distinct(); 

如果明顯不這樣做,因爲綁定工作是你可以做的不同物體

var result=from x in list 
     where x.DomainName.StartsWith("www.") 
     group x by x.DomainName into domain 
     select new ServerBindings { 
     DomainName=domain.Key, 
     IPAddress=domain.Select (d =>d.IPAddress).First() 
     }; 
+0

這不會刪除重複項。 – 2012-01-06 17:40:16

+0

@TimSchmelter是的,這是一個錯字,打算提交稍後提交 – 2012-01-06 17:44:40

+0

嗨鮑勃:這工作,但我已經改變了一點點的應用程序的設計..詳情請參閱上文,請你幫忙。 – Zaki 2012-01-09 15:27:23

-1
return inputList 
     .GroupBy(key=>key.IpAddress) 
     .Select(group => { 
       var domain = group.Any(g=>g.StartsWith("http://www")) 
        ? group.First(g=>g.StartsWith("http://www")) 
        : group.First(); 
       return new ServerBindings 
        { 
         DomainName = group.First 
         IpAddress = group.Key 
        };) 
     .ToList(); 
+0

但是,這將返回基於IP地址,而不是域 – 2012-01-06 18:05:51

+0

分組在IP地址讓你一個域名單。從該列表中,您可以選擇域,如果是1或域名是'www',那麼可以選擇默認域。那麼你有1:1的IP到域的關聯。那時你就擁有獨特的領域。 – 2012-01-06 18:40:41

+0

但是它們並不是唯一的域名,OP沒有指定IP到域的比例是1:1,如果有兩個域到單個IP,會發生什麼情況。OP指定的唯一域不是唯一的IP – 2012-01-06 18:46:46

0

像這樣的東西應該做這件事:

serverBindings 
    .Select(sb => new { Normalized = sb.DomainName.StartsWith("www.") ? sb.DomainName.Substring(4) : sb.DomainName, HasLeadingWWW = sb.DomainName.StartsWith("www."), Binding = sb }) 
    .GroupBy(sbn => sbn.Normalized) 
    .Select(g => g.OrderBy(sbn => sbn.HasLeadingWWW).First.Binding); 

注:我沒有測試過,可能需要一些調整。

+0

這會將www添加到沒有www的任何域,問題沒有要求這樣做。 – 2012-01-06 18:07:08

+0

它會怎麼做? – 2012-01-06 18:13:06

+0

Typo,我的意思是說,這將找到沒有www infront他們的域名。因此,如果在列表中沒有www.stackoverflow.com,但有一個stackoverflow.com,它仍然會找到stackoverflow.com – 2012-01-06 18:27:28