2012-01-06 265 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