我们有以下设置: 我们有一个带有字符串的对象数组(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
表示<id>2</id>
,因为包装器的对象的道具包含intersect
,{{1} }是null
。
如果我们使用错误的方法请说。它应该尽可能快地工作。找到时会发现一个简单的true
!
答案 0 :(得分: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)
检查。
另一个不太苛刻的解决方案是将Where
与Any
结合使用
IEnumerable<String> intersect = props.Where(p => ids.Any (i => p.Contains(i)));
或将Where
替换为另一个Any
,如果您不关心实际的项目,并且只需要true
或false
。
bool intersect = props.Any(p => ids.Any (i => p.Contains(i)));
答案 1 :(得分:2)
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i)))