2012-08-27 11 views
5

xml-ishですが正規化されていない文字列を持つオブジェクトの配列があり、idの文字列のリスト/配列を持っています。C#Linq、2つのリストで同じアイテムを検索しています

idのリストを持つ文字列がオブジェクトの1つにも含まれているかどうかを調べる必要があります。

ここでは、我々がしようとしているセットアップがあります。

public class Wrapper 
{ 
    public string MyProperty { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Wrapper> wrappers = new List<Wrapper>() 
     { 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>3</id><sqjldkjlfdskjlkfjsdklfj>"}, 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj>"} 
     }; 
     string[] ids = { "<id>0</id>", "<id>1</id>", "<id>2</id>" }; 

     var props = wrappers.Select(w => w.MyProperty); 
     var intersect = props.Intersect(ids, new MyEquilityTester()); 
     Debugger.Break(); 
    } 
} 

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

編集:私たちは、ラッパーは小道具を持つオブジェクトを持っているのでtrue言うれるintersect.Any()を行うときに我々が期待する何

ですが<id>2</id>を含む、intersectnullです。

私たちが間違った方法を使用している場合は、お伝えください。それは可能な限り速く動作するはずです。シンプルなtrueが見つかったら!

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y) || y.Contains(x); 
    } 

    public int GetHashCode(string obj) 
    { 
     return 0; 
    } 
} 

をし、それが

<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj> 

GetHashCodeは常に0を返すので、これは動作し、x.Contains(y) || y.Contains(x)チェック見つける:

+1

あなたの質問は何してくださいですか? –

+0

@DanielHilgarth私は投稿を更新しました – Frederiek

+0

ここで行うべき最も良いことは、「MyProperty」のテキストをより読みやすく/ linqに優しい/保守可能な構造に解析することです。 – devundef

答えて

6

あなたのケースでは、このようなあなたのIEqualitycomparerを書くことができます。


もうそれほどハックではない解決策は、あなたが気にしない場合は、実際のアイテムとあなたについて別のAnyWhereAny

IEnumerable<String> intersect = props.Where(p => ids.Any (i => p.Contains(i))); 

と組み合わせてWhereを使用するか、または交換することであるのみtrueまたはfalseが必要です。

bool intersect = props.Any(p => ids.Any (i => p.Contains(i))); 
+0

Thxたくさんの男、それは動作します! – Frederiek

1
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i))) 
関連する問題