2012-01-06 21 views
1

オブジェクトのリスト(ip、domainname)が見つかりました。それらの中に重複を見つけて、ドメイン名の前に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を試してみましたが、それにイム新しいと私はGROUPBYしようとしましたが、選択のものを言う方法を知りませんそこにはドメイン名の前にwwwがあります。 EDIT :::

は再びこれをテストして動作しないようです...私は、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

あなたがここにほしいものを正確に明確にすることはできますか?あなたがwww.stackoverflow.comではなく、リストに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

こんにちはボブ:これはうまくいったけど、アプリケーションのデザインを少し変更しました。上記を参照してください。 – 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

しかし、ドメイン名に固有のものではなく、OPはドメインとIPが1:1であると指定していません。単一のIPに対して2つのドメインがある場合はどうなりますか。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が見つかるでしょう –

関連する問題