2014-12-01 4 views
1

ZipArchive 및 압축 된 filename as a String을 포함하는 압축 파일 목록이 있습니다. 또한 목록으로 확인해야하는 파일 이름의 최종 목록이 있으며 파일이 내 최종 파일 이름 목록과 일치하지 않으면 내 압축 파일 목록에서 덤프해야합니다.파일 이름이 변수 이름 배열에 존재하지 않는 경우 찾기

내 말을 잘 못해서 내 코드/의사 코드로 설명하도록하겠습니다. 두 개의 매개 변수가

List<ZipContents> importList = new List<ZipContents>(); 

: 여기

내 목록이라고

  1. ZipArchive라고 ZipFile
  2. StringFileName

filenamesZipContents 목록을 확인하려고하는 파일 이름의 피날레 목록입니다.

foreach (var import in importList) 
{   
    var fn = import.FileName; 

    // do some kind of lookup to see if fn would be List<String> filenames 
    // If not in list dump from ZipContents 

} 

주석 처리 된 부분은 내가하는 일에 대한 확신입니다 것입니다 : 여기

는 내가 뭘하려고 오전의 시작입니다. 누군가 나를 올바른 길로 인도 할 수 있습니까? 감사!

EDIT 1

내가 원래 이런 말을하지 않았다 알고 있지만 내가 LINQ가 취할 수있는 많은 청소기 경로 될 것이라고 생각합니다. 나는 단지 긍정적 인 방법이 아닙니다. .RemoveAll(..)을 사용하면 내가 가고 싶을 것이라고 생각하고 있습니까?

답변

0

당신은 같은 것을 할 수있는 : 또는

if (!filenames.Contains(fn)) { 
    importList.Remove(import); 
} 

을, 당신이 하나의 선으로이 논리를 단순화하기 위해 Linq를 사용할 수 믿습니다.

편집 :

var newImportList = importList.Where(il => filenames.Contains(il.FileName)).ToList(); 
+0

정확히 이것은 내가 작성하려고했던 것입니다.이것이 당신의 대답이 아니라면 나는 그것이 당신을 올바른 길로 인도해야한다고 생각합니다. –

+0

나는 .Remove()를 사용하여 내 문제를 해결 한 방식을 좋아하지만 내용이 많고 제거되고 순서가 바뀌면 내 목록에 문제가 생길 수 있습니까? – scapegoat17

+0

목록에서 항목을 제거하려는 경우 사용자가하는 일과 관계없이 항목이 변경됩니다. .remove()를 사용하면 순서가 유지되지만 문제의 항목 만 제거하면됩니다. 그러나 다른 답변에서 지적했듯이 foreach에서 반복되는 목록을 수정하면 문제가 발생할 수 있습니다. 필자가 편집 한 코드 에서처럼 Linq를 사용하는 것이 더 나은 방법이라고 제안합니다. – Redit0

0

당신은 한 줄에이 작업을 수행 할 수 있습니다

예, 그냥 이런 당신이 원하는 바로 사람의 새로운 목록을 만들 수 있습니다. LINQ를 사용하여 목록을 다시 작성하십시오.

var filenames = new List<string> {"file1", "file2"}; 
var zipcontents = new List<ZipContents> 
{ 
    new ZipContents {FileName = "file1"}, 
    new ZipContents {FileName = "file2"}, 
    new ZipContents {FileName = "file3"} 
}; 

zipcontents = zipcontents.Where(z => filenames.Contains(z.FileName)).ToList(); 

//zipcontents contains only files that were in 'filenames' 

정직하게 말하면 데이터를 쿼리하는 것입니다.

0

importList을 역순으로 반복하고 filenames에서 항목을 제거하십시오. 당신이없는 가정하면 너무 많은 항목의 성능은 괜찮을 것 :

for (int i = importList.Count - 1; i >= 0; i--) 
{ 
    if (!filenames.Contains(importList[i].FileName)) 
    { 
     importList.RemoveAt(i); 
    } 
} 

당신이 컬렉션을 수정하기 때문에 foreach를 사용하여 목록에서 항목을 제거 할 수는 없지만 내 예제의 구조와 그것을 할 수 있습니다 .

관련 문제