Удалить дубликаты в списке - PullRequest
1 голос
/ 06 января 2012

У меня есть список объектов (ip, имя домена). и хотите найти дубликаты в них и удалить те, у которых нет 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

Ответы [ 3 ]

2 голосов
/ 06 января 2012
var result=inputList.Where(x=>x.DomainName.StartsWith("www.")).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 ()
      };
0 голосов
/ 06 января 2012

Что-то вроде этого должно делать все это:

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);

ПРИМЕЧАНИЕ: я не проверял, возможно, потребуется немного подправить.

0 голосов
/ 06 января 2012
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();
...