2012-08-27 1 views
5

우리는 다음과 같은 설정을 가지고 있습니다 : 문자열이있는 객체의 배열이 있고 (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>, intersectnull입니다.

잘못된 방법을 사용하는 경우 말하십시오. 그것은 가능한 한 빨리 작동해야합니다. 간단한 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) 체크 발견 할 것이다 :

+1

질문은 무엇하시기 바랍니다입니까? –

+0

@DanielHilgarth 게시물을 업데이트했습니다 – Frederiek

+0

여기서 가장 좋은 일은 'MyProperty'의 텍스트를 더 읽기 쉽고/linq 친화적 인/maintainable 구조로 구문 분석하는 것입니다. – devundef

답변

6

귀하의 경우를 들어,이처럼 IEqualitycomparer을 작성할 수 있습니다.


또 다른 그리 해키하지 솔루션은 상관하지 않는 경우 실제 항목과 당신에 대해 다른 Any으로 WhereAny

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

와 조합에 Where를 사용하거나 교체하는 경우에만 true 또는 false이 필요합니다.

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

Thx 많은 남자, 그것은 작동합니다! – Frederiek

1
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i))) 
관련 문제