我得到了一个对象列表(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的查询,忽略without....to查询,如果列表中有www.test.com、test.com和test3.com,最终结果应该是www.test.com和test3.com。
发布于 2012-01-06 17:39:45
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 ()
};发布于 2012-01-06 17:43:25
像这样的事情应该能做好所有的事情:
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);注意:我还没有测试它,可能需要一些调整。
https://stackoverflow.com/questions/8761960
复制相似问题