우리는 다음과 같은 설정을 가지고 있습니다 : 문자열이있는 객체의 배열이 있고 (xml-ish이지만 정규화되지 않았습니다) 우리는 id가있는 문자열의 목록/배열을 가지고 있습니다 .C# Linq, 두 목록에서 같은 항목을 검색 중
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
을 발견 할 경우!
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)
체크 발견 할 것이다 :
질문은 무엇하시기 바랍니다입니까? –
@DanielHilgarth 게시물을 업데이트했습니다 – Frederiek
여기서 가장 좋은 일은 'MyProperty'의 텍스트를 더 읽기 쉽고/linq 친화적 인/maintainable 구조로 구문 분석하는 것입니다. – devundef