C#Linq,在两个列表中搜索相同的项目

Fre*_*iek 5 c# linq

我们有以下设置:我们有一个带有字符串的对象数组(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();
     }
 }
Run Code Online (Sandbox Code Playgroud)

编辑:

我们期望的是当我们做一个.Any()on时intersect就是true因为包装器有一个带有支撑的对象,包含<id>2</id>,intersectnull.

如果我们使用错误的方法请说.它应该尽可能快地工作.true发现时会很简单!

slo*_*oth 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它会找到

<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为GetHashCode总是返回0,并 x.Contains(y) || y.Contains(x)检查.


另一个不太苛刻的解决方案是与... Where结合使用Any

IEnumerable<String> intersect = props.Where(p => ids.Any (i => p.Contains(i)));
Run Code Online (Sandbox Code Playgroud)

如果你不关心实际的物品而你只需要一个或那个Where,或者用另一个替换.Anytruefalse

bool intersect = props.Any(p => ids.Any (i => p.Contains(i)));
Run Code Online (Sandbox Code Playgroud)