2016-11-23 9 views
0

私は文字列のリストを持っています。各文字列はファイルへのフルパスです。今度は、このリストをファイル名でソートしたいと思います。リスト項目を[C#のファイル名で完全なパス]に並べ替えます

Sort()メソッドを使用すると、リストは完全なパスでソートされます。しかし、その道は違うかもしれません。

各アイテムの最後に何が残っているのかによってリストを並べ替える簡単な方法はありますか?

+0

'Path.GetFilename(" full_path ")'にソート – bixarrio

+3

[C#を使用してディレクトリ内のファイル名のみを取得する方法]の複製があります(http://stackoverflow.com/questions/7140081/how-to-get -only-filenames-within-a-directory-using-c) –

+0

@PeterBその質問は無関係です。 – Rob

答えて

7

あなたはSystem.IO.Path.GetFileNameとLINQを使用することができます。

files = files.OrderBy(System.IO.Path.GetFileName).ToList(); 
あなたは、大文字と小文字を区別しない方法で比較したい場合は

あなたが渡すことができStringComparer

files = files.OrderBy(System.IO.Path.GetFileName, StringComparer.InvariantCultureIgnoreCase).ToList(); 

OrderBy(およびOrderByDescending)はList.Sortとは対照的に、安定したソートアルゴリズムを使用することに注意してください。つまり、等しいすべての要素が元の順序にとどまります。

+0

また、ファイルのリストは 'OrderBy'で使用できる' Directory.EnumerateFiles() 'から取得することができます。この場合、ファイルをソートする前にリストや配列に一時的に保存します。 –

+0

ありがとう、それは助けた:) – Kai

3

あなたはPath.GetFileNameを探しています:

https://msdn.microsoft.com/en-us/library/system.io.path.getfilename(v=vs.110).aspx

List<string> files = ... 

    // when sorting via Sort we should compare file names 
    files.Sort((left, right) => 
    string.Compare(Path.GetFileName(left), Path.GetFileName(right))); 

LINQのOrderBy超えるSortの利点は

  • Sortは、LINQのは、追加のコレクションを作成するときに仕分け場所にを行います経由で.ToList()
  • ラムダ関数内に複雑なソートアルゴリズムを入れることができます。 LINQの場合には1がSortList<T>を必要とするときIComparer<T>インタフェース

は欠点が

  • あるLINQのは、ちょうどIEnumerable<T>を望んで実装する必要があります。 (2つの項目がソートされたリストでの実際の順序は保証されません等しいと見なされている場合)
  • Sort()
  • あまりにも頻繁にPath.GetFileNameを呼び出しstring.Compare(Path.GetFileName(left), Path.GetFileName(right))現在の最も簡単なimplementtation(約2倍のOrderByなど)
  • 不安定ソートアルゴリズムを使用しています
+0

CultureInfoとCompareOptionsを明示的に指定することができるので、この試みは他の方法よりも効果的です。 –

+0

@Manfred Radlwimmer:もう一つの利点は、 'Sort'はリストを* Linqとは違った場所にソートすることです(これは、追加のコレクションを作成します。 –

+0

@ManfredRadlwimmer: 'OrderBy'のオーバーロードを使用して' StringComparer'を渡すことができます。私はそれに応じて[私の答え](http://stackoverflow.com/a/40759683/284240)を編集しました。 –

1

このコード例では、

var getFileName = System.IO.Path.GetFileName("C:\temp\name.txt"); > temp.txt 

var getfileNameWithoutExtention = System.IO.Path.GetFileName("C:\temp\name.txt"); > name 

var getextention = System.IO.Path.GetFileName("C:\temp\name.txt"); > .txt 



List<string> patsh = new List<string> 
     { 
      @"C:\temp\name.txt", 
      @"C:\music\ranbow.mp3", 
      @"C:\net\core.cs", 
      @"C:\java\fr.jar" 
     }; 



patsh = patsh.OrderBy(System.IO.Path.GetFileNameWithoutExtension).ToList(); 

あなたはファイル拡張子で

patsh = patsh.OrderBy(System.IO.Path.GetFileNameWithoutExtension).ThenBy(System.IO.Path.GetExtension).ToList(); 
0

を、それをしたい場合は、このあなたはまた、それを並べ替えることができます

List<string> fullfilepath = new List<string>() { "C:\\text1.txt", "C:\\text2.txt", "D:\\text4.txt", "C:\\text3.txt", "C:\\text6.txt", "D:\\text5.txt" }; 
List<string> sortedfilename = fullfilepath.OrderBy(x => Path.GetFileName(x)).ToList(); 
+2

これはティムの答えとどのように違いますか? –

-1

のためのトリックを行う可能性がありますこのようにfileNameによって:

fileName = path.Split('\').Last(); 
+0

スラッシュではなくバックスラッシュです –

+0

バックスラッシュをエスケープする必要があります。 [私はここでdeja-vuを得ています^^](https://i.stack.imgur.com/cMRPA.jpg) –

関連する問題