2012-01-06 3 views
1

개체 (ip, domainname) 목록이 있습니다. 그 (것)들에있는 중복을 찾아 내고 도메인 이름의 앞에 www가없는 그들을 제거하고 싶다.목록에서 중복을 제거하십시오.

은 만약 그렇다면 그것은 목록 내가 stackoverflow.com을 제거 할

192.168.0.0 www.stackoverflow.com 
192.168.0.1 stackoverflow.com 

입니다.

지금까지 내가이 기능에 개체의 내 목록을 전달하고 내 코드입니다 : 내가 선택한 사람 말을하는 방법을 알고 GROUPBY하지만 해달라고하려고 내가 그것에 LINQ하지만 같은 메신저 새로운 시도했다

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

도메인 이름 앞에 www가 있습니다. 편집 :::

다시이 테스트 작동하지 않을 것 같다 ... 내가 LINQ 쿼리 앞에 WWW가있는 경우에만 사람을 선택하고 명확하게 ....하지 않고 사람을 무시 의미 목록에 우리가있는 경우 www.test.com, test.com 및 test3.com 최종 결과는 www.test.com과 test3.com을해야

+1

이것은 [** linq **] [1]을 (를) 사용하여 목록에서 중복을 제거하는 방법입니다. [1] : http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq –

+0

중복 http://stackoverflow.com/questions/1606679/remove -duplicates-in-the-list-using-linq –

+0

여기에서 원하는 것을 정확하게 설명 할 수 있습니까? 목록에 stackoverflow.com이 있지만 www.stackoverflow.com이 아닌 경우 알고리즘을 www.stackoverflow.com에 추가하여 사용 하시겠습니까? –

답변

2
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

중복 된 항목은 제거되지 않습니다. –

+0

@TimSchmelter 예, 오타되었습니다. 나중에 제출하라는 의미입니다. –

+0

안녕하세요 Bob :이 방법이 효과가 있었지만 응용 프로그램 디자인을 약간 변경했습니다. 위의 내용을 참조하십시오. – Zaki

-1
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(); 
+0

하지만이 주소는 도메인이 아닌 IP 주소를 기반으로 반환됩니다. –

+0

IP 주소를 그룹화하면 도메인 목록이 표시됩니다. 해당 목록에서 도메인을 선택할 수 있습니다. 기본값이 1 인 경우 기본값이거나 'www'가있는 도메인입니다. 그러면 도메인에 IP의 1 : 1 연관성이 있습니다. 이 시점에서 고유 한 도메인을 갖게됩니다. –

+0

하지만 그들은 domainname에 고유하지 않습니다. OP는 도메인을 IP에 1 : 1로 지정하지 않았으며 단일 IP에 대해 두 개의 도메인이있는 경우 어떻게됩니까?OP는 고유 한 IP가 아닌 고유 한 도메인을 지정했습니다. –

0

뭔가가 모든 일을 수행해야합니다

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

이것은 www가없는 도메인에 www를 추가합니다.이 질문은 질문하지 않았습니다. –

+0

어떻게 그럴 수 있습니까? –

+0

Typo, 내가 말하고자했던 것은 www가없는 도메인을 찾을 수 있다는 것입니다. 목록에 www.stackoverflow.com이 없지만 stackoverflow.com이 있다면 stackoverflow.com을 찾을 수 있습니다. –

관련 문제