查找重复的名单,但与标准 [英] Find Duplicate in list but with criteria

查看:124
本文介绍了查找重复的名单,但与标准的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想从列表中删除重复的,所以如果我的名单包括:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆