[英]C# Linq, Searching for same items in two lists
我們有以下設置:我們有一個帶有字符串的對象數組(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
是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)
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)));
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.