私は文字列のリストを持っています。各文字列はファイルへのフルパスです。今度は、このリストをファイル名でソートしたいと思います。リスト項目を[C#のファイル名で完全なパス]に並べ替えます
Sort()メソッドを使用すると、リストは完全なパスでソートされます。しかし、その道は違うかもしれません。
各アイテムの最後に何が残っているのかによってリストを並べ替える簡単な方法はありますか?
私は文字列のリストを持っています。各文字列はファイルへのフルパスです。今度は、このリストをファイル名でソートしたいと思います。リスト項目を[C#のファイル名で完全なパス]に並べ替えます
Sort()メソッドを使用すると、リストは完全なパスでソートされます。しかし、その道は違うかもしれません。
各アイテムの最後に何が残っているのかによってリストを並べ替える簡単な方法はありますか?
あなたは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
とは対照的に、安定したソートアルゴリズムを使用することに注意してください。つまり、等しいすべての要素が元の順序にとどまります。
また、ファイルのリストは 'OrderBy'で使用できる' Directory.EnumerateFiles() 'から取得することができます。この場合、ファイルをソートする前にリストや配列に一時的に保存します。 –
ありがとう、それは助けた:) – Kai
あなたは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()
Sort
がList<T>
を必要とするときIComparer<T>
インタフェースは欠点が
IEnumerable<T>
を望んで実装する必要があります。 (2つの項目がソートされたリストでの実際の順序は保証されません等しいと見なされている場合)Sort()
はPath.GetFileName
を呼び出しstring.Compare(Path.GetFileName(left), Path.GetFileName(right))
現在の最も簡単なimplementtation(約2倍のOrderBy
など)CultureInfoとCompareOptionsを明示的に指定することができるので、この試みは他の方法よりも効果的です。 –
@Manfred Radlwimmer:もう一つの利点は、 'Sort'はリストを* Linqとは違った場所にソートすることです(これは、追加のコレクションを作成します。 –
@ManfredRadlwimmer: 'OrderBy'のオーバーロードを使用して' StringComparer'を渡すことができます。私はそれに応じて[私の答え](http://stackoverflow.com/a/40759683/284240)を編集しました。 –
このコード例では、
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();
を、それをしたい場合は、このあなたはまた、それを並べ替えることができます
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();
これはティムの答えとどのように違いますか? –
のためのトリックを行う可能性がありますこのようにfileNameによって:
fileName = path.Split('\').Last();
スラッシュではなくバックスラッシュです –
バックスラッシュをエスケープする必要があります。 [私はここでdeja-vuを得ています^^](https://i.stack.imgur.com/cMRPA.jpg) –
'Path.GetFilename(" full_path ")'にソート – bixarrio
[C#を使用してディレクトリ内のファイル名のみを取得する方法]の複製があります(http://stackoverflow.com/questions/7140081/how-to-get -only-filenames-within-a-directory-using-c) –
@PeterBその質問は無関係です。 – Rob