查找重复的名单,但与标准 [英] Find Duplicate in list but with criteria
问题描述
想从列表中删除重复的,所以如果我的名单包括:
www.test.com
测试.COM
mytest.com
我想最终名单看起来像下面(只有选择从前面的重复使用WWW域):
www.test.com
mytest.com
我有这样的LINQ,但它似乎忽略所有不具备在前面的WWW,因为它是只选择WWW的域名的:
VAR的结果= inputList.Where(X => x.DomainName.StartsWith(WWW))。不同();
编辑:
@DanielHilgarth:我只是运行你的代码,它不产生正确的结果。我有:
test.com
www.test.com
test2.com
www.test2.com
test3.com
www.test3.com
test4.com
在我的名单。它返回这样的:
test.com
www.test.com
$ www.test2.com b $ b www.test3.com
和这里是我如何使用您的代码:
VAR的结果= lstServerBindings.GroupBy(X => x.DomainName.StartsWith(WWW)x.DomainName:WWW。 + X)
。选择(X =>
{
变种域=
x.FirstOrDefault(Y => y.DomainName.StartsWith(WWW)。 );
如果(域== NULL)
返回x.First();
返回域;
});
然后我做一个foreach循环分配给新的列表:
的foreach(在结果VAR项)
{
lstUniqueServerBindings.Add(新ServerBindings
{
ip地址=项目.IPAddress,
=会将PortNumber item.PortNumber,
域名= item.DomainName
});
}
我觉得你想有这样的事情:
VAR的结果= domains.GroupBy(X => x.StartsWith(WWW。 )X:?www的+ X)
。选择(X =>
{
变种域=
x.FirstOrDefault(Y => y.StartsWith (WWW));
如果(域== NULL)
返回x.First();
返回域;
});
我这个输入测试它:
VAR域=新的List<串GT;
{
www.test.com,
test.com,
mytest.com,
abc.com,
www.abc.com
};
的结果是:
www.test.com
mytest.com
www.abc.com
您的代码应该是这样的(注意额外的 .DomainName
第二行的结尾)
VAR的结果= lstServerBindings.GroupBy(X => x.DomainName.StartsWith(WWW)$ b? $ b x.DomainName:WWW+ x.DomainName)
。选择(X =>
{
变种域=
x.FirstOrDefault(Y =>
y.DomainName.StartsWith(WWW));
如果(域== NULL)
返回x.First();
返回域;
});
BTW:
$:您可以通过代码改变这种保存自己的foreach循环2 b$ b
VAR的结果= lstServerBindings.GroupBy(X => x.DomainName.StartsWith(WWW)
x.DomainName: WWW。+ x.DomainName)
。选择(X =>
{
变种项=
x.FirstOrDefault(Y =>
Y形。 DomainName.StartsWith(WWW));
如果(项目== NULL)
项= x.First();
返回新ServerBindings
{
ip地址= item.IPAddress,
=会将PortNumber item.PortNumber,
域名= item.DomainName
};
});
Want to remove duplicates from a list so if my list contains:
www.test.com
test.com
mytest.com
I want the final list to look like below(only selecting the domains with www from the duplicate in front) :
www.test.com
mytest.com
I have this linq but it seems to ignore all the domains which dont have www in front because it is selecting only www ones:
var result=inputList.Where(x=>x.DomainName.StartsWith("www.")).Distinct();
Edit:
@DanielHilgarth: I just run your code and it doesnt produce right results. I have :
test.com
www.test.com
test2.com
www.test2.com
test3.com
www.test3.com
test4.com
in my list. It returns this :
test.com
www.test.com
www.test2.com
www.test3.com
and here is how i use your code :
var result = lstServerBindings.GroupBy(x => x.DomainName.StartsWith("www.") ? x.DomainName : "www." + x)
.Select(x =>
{
var domain =
x.FirstOrDefault(y => y.DomainName.StartsWith("www."));
if (domain == null)
return x.First();
return domain;
});
And then i do a foreach loop to assign to new list:
foreach (var item in result)
{
lstUniqueServerBindings.Add(new ServerBindings
{
IPAddress = item.IPAddress,
PortNumber = item.PortNumber,
DomainName = item.DomainName
});
}
I think you want to have something like this:
var result = domains.GroupBy(x => x.StartsWith("www.") ? x : "www." + x)
.Select(x =>
{
var domain =
x.FirstOrDefault(y => y.StartsWith("www."));
if(domain == null)
return x.First();
return domain;
});
I tested it with this input:
var domains = new List<string>
{
"www.test.com",
"test.com",
"mytest.com",
"abc.com",
"www.abc.com"
};
Result is:
www.test.com
mytest.com
www.abc.com
Your code should look like this (note the additional .DomainName
at the end of the second line):
var result = lstServerBindings.GroupBy(x => x.DomainName.StartsWith("www.") ?
x.DomainName : "www." + x.DomainName)
.Select(x =>
{
var domain =
x.FirstOrDefault(y =>
y.DomainName.StartsWith("www."));
if (domain == null)
return x.First();
return domain;
});
BTW: You can save yourself the foreach loop by changing the code to this:
var result = lstServerBindings.GroupBy(x => x.DomainName.StartsWith("www.") ?
x.DomainName : "www." + x.DomainName)
.Select(x =>
{
var item =
x.FirstOrDefault(y =>
y.DomainName.StartsWith("www."));
if (item == null)
item = x.First();
return new ServerBindings
{
IPAddress = item.IPAddress,
PortNumber = item.PortNumber,
DomainName = item.DomainName
};
});
这篇关于查找重复的名单,但与标准的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!