我们有以下设置: 我们有一个对象数组,其中包含一个字符串(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>
, intersect
是null
.
如果我们使用了错误的方法,请指出。它应该尽可能快地工作。一个简单的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 的解决方案是将 Where
与 Any
结合使用
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/