C# Linq,查找两个列表中相同的项

5
我们有以下设置: 我们有一个对象数组,其中包含一个字符串(类似于xml但未规范化),还有一个带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();
     }
 }

编辑:
我们期望的是,当我们在intersect上执行.Any()时,它会显示true,因为wrappers具有包含2的prop对象,intersect为null。
如果我们使用了错误的方法,请告诉我们。它应该尽可能快地工作。找到一个简单的true就可以了!

在这里最好的做法是将 MyProperty 中的文本解析为更易读/友好的 Linq/可维护结构。 - Marcelo De Zen
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总是返回0,以及x.Contains(y) || y.Contains(x)的检查。
另一个不那么诡异的解决方案是结合使用WhereAny
IEnumerable<String> intersect = props.Where(p => ids.Any (i => p.Contains(i)));

如果您只关心是否有符合条件的项,而不在意实际的项,可以将 Where 替换为另一个 Any,以获取 truefalse

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

2
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接