LINQ

2017-12-22 18 views
1

를 사용하여 다차원 배열 객체의 내용을 검색 I 다음 개체가 :LINQ

public class RandomModel : Metadata 
{ 
    public string Name { get; set; } 
    public ContentMod[][] Content { get; set; } 

    public class ContentMod 
    { 
     public string Subtitle { get; set; } 
     public string Text { get; set; } 
     public string[] List { get; set; } 
    } 
} 

내가 검색하고 (그 변수의 문자열 값 입력을 포함하는 ContentMod를 포함하는 RandomModel를 반환하기 위해 노력하고있어 자막, 텍스트 및/또는 목록).

내가 다음에 해당 할 노력하고 있어요 :

를 그래서 나는 RandomModel을의 RandomModel에서 이름의 텍스트와는 검색 문자열을 포함 않는 경우 문자열 검색 입력 검색 반환하려는 경우, 나는 다음과 같은 것을 할 것이다 :

var randomContent = (from item in RandomContent 
        where item.Name.ToUpper().Contains(search) 
        select item).ToList(); 

이제 ContentMod의 모든 매개 변수 내에서 텍스트를 검색하려고한다. 같은

뭔가 다음

var randomContent = (from item in RandomContent 
        where item.ContentMod.???.ToUpper().Contains(search) 
        select item).ToList(); 

내가 알아낼 수없는 것 ??? 상기 부분. linq을 사용하여 다차원 객체의 내용을 반복하고 문자열 검색을 포함하는 경우 RandomModel을 반환합니다.

도움을 주시면 감사하겠습니다. Al

답변

1

쿼리 구문 대신 메서드 구문을 사용하는 경우이 코드는 어떻습니까? 그것과 같을 것이다 경우에, 그래서

var randomContent = models.Where(r => r.Content.Any(x => 
{ 
    return x.Any(y => 
    { 
     return y.Text.ToUpper().Contains(search) 
      || y.Subtitle.ToUpper().Contains(search) 
      || y.List.Any(z => z.ToUpper().Contains(search)); 
    }); 
})).ToList(); 

나는 보통, 대소 문자를 구분 검색을 수행 할 IndexOf를 사용합니다.

var randomContent = models.Where(r => r.Content.Any(x => 
{ 
    return x.Any(y => 
    { 
     return y.Text.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 
     || y.Subtitle.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 
     || y.List.Any(z => z.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0); 
    }); 
})).ToList(); 

필요에 따라 StringComparison을 사용할 수 있습니다.

편집 : 댓글의 뒤쪽에 표시된대로 SelectMany을 사용하면이 사실을 알 수 있습니다.

var randomContent = models.Select(r => r.Content.SelectMany(o => o.Where(x => 
{ 
    return x.Text.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 
     || x.Subtitle.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) >= 0 
     || x.List.Any(y => y.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) >= 0); 
}))).ToList(); 
+0

'r.Content.SelectMany (O => O)'이 꽤 도움이 와우 이런 좋은 정보 덕분에 – Backs

+0

표현을 단순화 할 수 있습니다! – Baraa