5

我们有以下设置:我们有一个对象数组,其中包含一个字符串(xml-ish 但未标准化),我们有一个带有 id 的字符串列表/数组。

我们需要找出该列表中带有 id 的字符串是否也在其中一个对象中存在。

在这里,我们有一个我们尝试过的设置:

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

编辑:

我们期望的是,当我们执行.Any()on intersectthat is时,true因为 wrappers 有一个带有 prop 的对象,该 prop 包含<id>2</id>, intersectis null

如果我们使用了错误的方法,请说。它应该尽可能快地工作。一个简单的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)检查。


另一个不那么 hacky 的解决方案是Where结合使用 aAny

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

如果您不关心实际项目并且只想要一个or ,则将其替换为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 回答