2014-11-07 4 views
1

동일한 기본 클래스에서 상속하는 4 개의 클래스가 있습니다. 그들은 모두 공통적으로 Path 속성이 &입니다. 내 데이터가 XML에서로드되면이 클래스를 기반으로 4 개의 목록을 작성합니다.linq을 사용하여 여러 목록에서 중복 된 항목 찾기

내가 나를 2 개에는 비교할 수 있습니다 다음과 같은 코드를 가지고 : 나는 다른 3 1 목록을 비교하려는

  1. 싶습니다

    var list1 = settings.EmailFolders.Select(m => m.Path).ToList(). 
    Intersect(settings.LogPaths.Select(m=>m.Path).ToList()).ToList(); 
    

    하지만 및 중복 경로가 있는지 확인하십시오.

  2. 아무것도 발견되지 않으면 그때 두 번째 목록을 비교 같은 논리를 적용하고 그것을 비교할 다름이 발견되지 않으면, 그때 비교 같은 논리를 적용 할 2.

  3. 세 번째 목록을 비교하고 마지막 목록과 비교하십시오.

중복이 발견되면 관련 오류를보고하고 싶습니다. 점 1, 2 및 3은 단일 프로세스에서 원하지 않습니다.

내가 위의 내용을 다시 사용하고 추가 목록에 추가 Intersect를 추가 할 경우,

var list1 = settings.EmailFolders.Select(m => m.Path).ToList(). 
Intersect(settings.LogPaths.Select(m=>m.Path).ToList()). 
Intersect(settings.SuccessPaths.Select(m=>m.Path).ToList()). 
Intersect(settings.FailurePaths.Select(m=>m.Path).ToList()).List(); 

위의 내가 원하는 아닌 or 연산자보다 각 오히려 사이에 and 연산자를 적용하고 싶습니다.

내가 @Devuxer 제안에 따라 답변에 내 질문에 업데이 트했습니다 : FailurePaths 또는 LogPaths 또는 SuccessPaths에 사용되는 경로 중 하나가 이미 UPDATE가

내 EmailFolder.Path에 사용하는 경우 내가 알 필요가 어떤 올바른 대답을하지만 문자열 배열 작업 대신, 나는 모든 Path 속성을 포함하는 클래스의 목록에 그것을 기반으로 해요. 위의 예에서 단순 위해, 나는 단지 관련 데이터를로드하지만 내 경우, 모든 데이터가 한 번에 직렬화 및로드되는 각 함수 내 목록을 선언 한 것을

List<EmailFolder> emailFolders = LoadEmailFolders(); 
List<LogPath> logPaths = LoadLogPaths(); 
List<SuccessPath> successPaths = LoadSuccessPaths(); 
List<FailurePath> failurePaths = LoadFailurePaths(); 

var pathCollisions = EmailFolders.Select(a=>a.Path) 
.Intersect(LogPaths.Select(b=>b.Path)) 
.Select(x => new { Type = "LogPath", Path = x }) 
.Concat(EmailFolders.Select(c=>c.Path) 
.Intersect(SuccessPaths.Select(d=>d.Path)) 
.Select(x => new { Type = "SuccessPath", Path = x })) 
.Concat(EmailFolders.Select(e=>e.Path) 
.Intersect(FailurePaths.Select(f=>f.Path)) 
.Select(x => new { Type = "FailurePath", Path = x })).ToList(); 

참고.

답변

0

나는 약간의 요구 사항을 오해 할 수 있지만,이 같은 것을 원하는 것 같습니다 :

var emailFolders = new[] { "a", "b", "c" }; 
var logPaths = new[] { "c", "d", "e" }; 
var successPaths = new[] { "f", "g", "h" }; 
var failurePaths = new[] { "a", "c", "h" }; 

var pathCollisions = emailFolders 
    .Intersect(logPaths) 
    .Select(x => new { Type = "Email-Log", Path = x }) 
    .Concat(emailFolders 
     .Intersect(successPaths) 
     .Select(x => new { Type = "Email-Success", Path = x })) 
    .Concat(emailFolders 
     .Intersect(failurePaths) 
     .Select(x => new { Type = "Email-Failure", Path = x })); 

이 결과를 : 이것이 당신이 찾고 있던 무슨 경우

Type   | Path 
-------------------- 
Email-Log  | c 
Email-Failure | a 
Email-Failure | c 
-------------------- 

, Intersect 확실히 중복을 찾을 수있는 올바른 방법이었다. 방금 Concat 절을 추가하고 Type을 제공하여 어떤 유형의 경로 충돌이 발생했는지 확인할 수 있습니다.

편집

그럼 귀하의 질문에 총알이 질문의 마지막 문장에서 다른 무언가를 요구하는 것.

var pathCollisions = emailFolders 
    .Intersect(logPaths) 
    .Select(x => new { Type = "Email-Log", Path = x }) 
    .Concat(emailFolders 
     .Intersect(successPaths) 
     .Select(x => new { Type = "Email-Success", Path = x })) 
    .Concat(emailFolders 
     .Intersect(failurePaths) 
     .Select(x => new { Type = "Email-Failure", Path = x })) 
    .Concat(logPaths 
     .Intersect(successPaths) 
     .Select(x => new { Type = "Log-Success", Path = x })) 
    .Concat(logPaths 
     .Intersect(failurePaths) 
     .Select(x => new { Type = "Log-Failure", Path = x })) 
    .Concat(successPaths 
     .Intersect(failurePaths) 
     .Select(x => new { Type = "Success-Failure", Path = x })); 

이 없다 "단락"이 의도하는 방식하지만 (그래서 찾을 않습니다 당신이 정말로 모든 비교를 원하는 경우

은, 그 한 가지 방법은 더 Concat 절을 추가하는 것입니다 모두 첫 번째 유형 다음에 중지하지 않고 경로 충돌이 발생하지만 보고서를 생성하는 데 필요한 데이터를 제공해야합니다.

+0

나는 당신이 제안한 것을 시도해야합니다. 그것은 나를 웃게했다 :) linq에서 할 수있는 것과 놀랍게도, 나는이 주제에 대해 잘 모르고있다. 정말 놀라운! 가지고있는 것은 좋지만 문자열 배열을 적용하는 대신 객체 목록에 적용하고 싶습니다. – Thierry

+0

@Thierry, 상황에 맞는 예제를 만들려면 각 new 문에 대해'new {Type = "Email-Log", Path = x.Path}'할 수 있다고 생각합니다. – devuxer

+1

완벽한! 그것은 매력을 작동! 각 질문에 Path 속성이있는 객체 목록을 사용하여 대답으로 내 질문을 업데이트합니다. 감사. – Thierry

0

당신은이

var result = list1.Where(x => list2.Contains(x.Path)); 

그것은 당신 만 카운트가 다음 사용하려는 경우리스트 2

에 또한 목록 1에서 모든 항목을 줄 것이다 비교하는 속성을 사용하여 포함 할 수 있습니다.다른 3 개에는

비교에 적용되는 최종

동일한 규칙에() 카운트

관련 문제