2013-08-12 5 views
2

문자열 배열을 가져 오는 중 파일 이름의 하위 문자열로 사용자 지정 정렬하려면 C# **. NET 3.5를 사용하십시오. 아래는 내가 함께 일하는 것입니다.사용자 지정 정렬 파일 이름 문자열 배열

  <% string[] files = System.IO.Directory.GetFiles("...path..." + pageName + "\\reference\\"); 
      files = String.Join(",", files).Replace("...path...", "").Replace("\\reference\\", "").Replace(pageName, "").Split(new Char[] { ',' }); 
       foreach (String item in files) 
       { 
        Response.Write("<a href=" + pageName + "/reference/" + System.IO.Path.GetFileName(item) + " target='_blank'>" + item.Replace("_", " ").Replace(".pdf", " ") + "</a>"); 
       } 
     %> 

나는 C# noob이고 여기에서 어디로 가야할지 모르겠다. 기본적으로 파일 이름에 하위 문자열 (예 : '색인', '참조', '목록', 문자열 '색인'이 포함 된 파일이 먼저 나열 됨)을 찾고 있습니다. 아마도 더 좋은 방법이있을 것입니다. 어떤 도움을 주시면 감사하겠습니다.

+0

그래서 "색인"이 먼저오고 "참조"는 2 번째로 "목록"이 마지막입니까? –

+0

이 맞습니다. – eric

답변

2

Linq를 사용하여 파일 이름별로 배열을 정렬 할 수 있습니다. 일반적으로 경로로 작업하는 경우 Path 클래스를 사용하십시오.

string fullPath = Path.Combine(directory, pageName, "reference"); 
var filePaths = Directory.EnumerateFiles(fullPath, "*.*", SearchOption.TopDirectoryOnly) 
    .Select(fp => new{ FullPath = fp, FileName=Path.GetFileName(fp) }) 
    .OrderByDescending(x => x.FileName.IndexOf("index", StringComparison.OrdinalIgnoreCase) >= 0) 
    .ThenByDescending(x => x.FileName.IndexOf("reference", StringComparison.OrdinalIgnoreCase) >= 0) 
    .ThenByDescending(x => x.FileName.IndexOf("list", StringComparison.OrdinalIgnoreCase) >= 0) 
    .ThenBy(x=> x.FileName) 
    .Select(x => x.FullPath); 
foreach(string filePath in filePaths) 
    ;// ... 

당신이 ("인덱스"와 "인덱스"같은 간주되도록) 대문자와 소문자를 구별하지 않고로 비교하지 않으려면

String.Contains 대신 + StringComparison.OrdinalIgnoreCase String.IndexOf 사용합니다.

+0

도움이 된 보이지만 불행히도 .net 3.5 메서드를 'enumeratefiles'포함하지 않는 사용하고 있습니다. 원래 질문에서 언급하지 않으셔서 죄송합니다. 그것이 나에게 달렸다면 4로 업그레이드 하겠지만 내 전화는 아닙니다. – eric

+0

그런 다음'GetFiles'를 대신 사용하십시오. 유일한 차이점은'EnumerateFiles'가 파일을 지연 처리하는 반면에, 이것은 모든 것을 메모리에 먼저로드한다는 것입니다. 나는 나의 대답을 편집했다. 이제'OrderByDescending' 대신'ThenByDescending'을 올바르게 사용하고 있습니다 (복사 & 붙여 넣기 버그). –

+0

이것은 아름답게 작동했습니다, 감사합니다! – eric

1

다음은이 문제가 발생할 때 사용하는 쉬운 방법입니다.

목록의 하위 문자열 순서를 정의하십시오. 그런 다음 각 항목에 대해 해당 항목을 포함하는 첫 번째 항목이 무엇인지 확인하십시오. 그런 다음 목록의 하위 문자열 순서로 정렬합니다.

public class SubStringSorter : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     var source = x.ToLowerInvariant(); 
     var target = y.ToLowerInvariant(); 

     var types = new List<string> { "base", "data", "model", "services", "interceptor", "controllers", "directives", "filters", "app", "tests", "unittests" }; 

     var sourceType = types.IndexOf(types.FirstOrDefault(source.Contains)); 
     var targetType = types.IndexOf(types.FirstOrDefault(target.Contains)); 

     return sourceType.CompareTo(targetType); 
    } 
} 

가 할, 당신도 한 단계 더 갈 수

enter image description here

var list = new List<string>{ "baseFile", "servicesFile", "this ModElstuff" }; 

list.Sort(new SubStringSorter()); 

그리고 출력과 같이 당신의 파일을 정렬하고, 문자열 분류기를 일부로 목록을 제공합니다 다른 항목과 함께 하위 문자열 정렬 순서를 다시 사용할 수 있습니다. 문자열이 모든 컨텍스트에 있으면 테스트를 게시했지만, 문자열로 시작하는 데 관심이 있다면 그렇게 할 수도 있습니다.