我有一个对象列表(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但是作为我的新手我试图组合但不知道怎么说选择那里有域名前面的www。
编辑:::
再次对此进行了测试,似乎无法正常工作...我的意思是linq查询仅选择前面有www的那些并忽略那些没有....以澄清如果在列表中我们有www.test.com, test.com和test3.com的最终结果应该是www.test.com和test3.com
答案 0 :(得分:2)
var result=inputList.Where(x=>x.DomainName.StartsWith("www.")).Distinct();
如果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 ()
};
答案 1 :(得分: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);
注意:我没有测试过,可能需要一些调整。
答案 2 :(得分:-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();