5

次の設定があります。文字列を含むオブジェクトの配列(xml風ですが、正規化されていません)と、IDを持つ文字列のリスト/配列があります。

そのリストの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();
     }
 }

編集:

ラッパーには、を含むpropを持つオブジェクトがあるため、これを実行すると、が期待.Any()されます。intersecttrue<id>2</id>intersectnull

間違った方法を使用している場合は、言ってください。可能な限り高速に動作するはずです。見つかったときに簡単trueにできます!

4

2 に答える 2

6

あなたの場合、次のように書くことができますIEqualitycomparer

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常に return0x.Contains(y) || y.Contains(x)check があるため機能します。


それほどハックではない別の解決策は、Whereと組み合わせて使用​​することですAny

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

または、実際のアイテムを気にせず、またはのみが必要な場合は、Whereを別のものに置き換えます。Anytruefalse

bool intersect = props.Any(p => ids.Any (i => p.Contains(i)));
于 2012-08-27T14:16:17.747 に答える
2
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i)))
于 2012-08-27T14:19:55.260 に答える