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

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

编辑:

当我们执行 .Any() 时,我们期望的是在 intersect也就是说true因为 wrappers 有一个对象,其 prop 包含 <id>2</id> , intersectnull .

如果我们使用了错误的方法,请指出。它应该尽可能快地工作。一个简单的true找到后就可以了!

最佳答案

对于您的情况,您可以像这样编写您的 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) 检查。


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

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

如果您不关心实际项目并且您只想要一个 true,则将 Where 替换为另一个 Any >假

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

关于C# Linq,在两个列表中搜索相同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12143657/

相关文章:

c# - 在 bundleconfig 中添加 Bootstrap 在 asp.net mvc 中不起作用

c# - 两种方式绑定(bind)到用户控件中的依赖属性并调用方法

c# - 如何在 ASP.NET MVC 中实现 "natural"url 方案路由表

c# - 用数据库查询结果填充列表框

c# - LINQ GroupBy 然后 OrderBy 上一个查询的属性

c# - 根据元素变量和元素位置拆分列表

c# - LINQ 不同查询

c# - Jquery 在 UserControl 中不工作

c# - 在 C# 中转换数组的优雅方式?

c# - 将 n-m 关系连接查询转换为 Linq