在列表中查找重复但有条件

Zak*_*aki 4 c# linq list

想要从列表中删除重复项,以便我的列表包含:

www.test.com
test.com
mytest.com
Run Code Online (Sandbox Code Playgroud)

我希望最终列表如下所示(仅从前面的副本中选择带有www的域):

www.test.com
mytest.com
Run Code Online (Sandbox Code Playgroud)

我有这个linq,但似乎忽略了所有没有www前面的域名,因为它只选择了www:

var result=inputList.Where(x=>x.DomainName.StartsWith("www.")).Distinct();
Run Code Online (Sandbox Code Playgroud)

编辑:

@DanielHilgarth:我只是运行你的代码并没有产生正确的结果.我有 :

test.com 
www.test.com 
test2.com 
www.test2.com 
test3.com 
www.test3.com 
test4.com 
Run Code Online (Sandbox Code Playgroud)

在我的清单中.它返回:

test.com
www.test.com
www.test2.com 
www.test3.com 
Run Code Online (Sandbox Code Playgroud)

以下是我如何使用您的代码:

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;
                                                });
Run Code Online (Sandbox Code Playgroud)

然后我做一个foreach循环来分配到新列表:

foreach (var item in result)
                            {
                                lstUniqueServerBindings.Add(new ServerBindings
                                {
                                    IPAddress = item.IPAddress,
                                    PortNumber = item.PortNumber,
                                    DomainName = item.DomainName
                                });

                            }
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 5

我想你想要这样的东西:

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;
                            });
Run Code Online (Sandbox Code Playgroud)

我用这个输入测试了它:

var domains = new List<string>
              {
                  "www.test.com",
                  "test.com",
                  "mytest.com",
                  "abc.com",
                  "www.abc.com"
              };
Run Code Online (Sandbox Code Playgroud)

结果是:

www.test.com
mytest.com
www.abc.com
Run Code Online (Sandbox Code Playgroud)

您的代码应如下所示(请注意.DomainName第二行末尾的附加内容):

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;
                                      });
Run Code Online (Sandbox Code Playgroud)

顺便说一句:您可以通过将代码更改为以下内容来保存自己的foreach循环:

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
                                              };
                                      });
Run Code Online (Sandbox Code Playgroud)