-6

私が次のファイルを持っていると仮定しましょう

File_1.txt
File_2.txt
File_1_Over.txt
File_2_Item.txt

File_1_Over.bat
File_1_Over_test.bat
File_2_Standard.bat
File_2_Item_Standard.bat

txtファイルとそのファイルをグループ化したいbat

私は次のようなコードを書きました:

List<string> val1 = new List<string> {
          "File_1.txt","File_2.txt","File_1_Over.txt","File_2_Item.txt","File_1_Over.bat",
            "File_1_Over_test.bat","File_2_Standard.bat","File_2_Item_Standard.bat"
        };

        val1.GroupBy(f => Path.GetFileNameWithoutExtension(f));

        foreach(string i in val1){
            Console.WriteLine(i);   
        }

次のように表示されます。

File_1.txt
File_2.txt
File_1_Over.txt
File_2_Item.txt
File_1_Over.bat
File_1_Over_test.bat
File_2_Standard.bat
File_2_Item_Standard.bat

それは大丈夫ではありません。それはそうですSort。このように表示したい:

File_1.txt
File_1_Over.txt
File_1_Over.bat
File_1_Over_test.bat
File_2.txt
File_2_Standard.bat
File_2_Item.txt
File_2_Item_Standard.bat

私はhttp://compilr.comでコードを書きました(私のコードをライブで参照してください:https ://compilr.com/djsonique4ever/testproj/main.cs )

とにかく、私は最初にBATではなくTXTファイルになりたいと思っています。

4

3 に答える 3

1

あなたがそれを望むようにそれが本当に出てくることを本当に確実にするために、あなたはそれをそのようにすることができます

var val = val1
    .GroupBy(f => Path.GetFileNameWithoutExtension(f)) //group by filename
    .OrderBy(group => group.Key); //here's the "Sort"

foreach (var group in val)
{
    var q = group.OrderByDescending(f => Path.GetExtension(f)); //order the filenames for outputting
    foreach (var f in q)
    {
        Console.WriteLine(f);
    }
}

私はあなたの仕事を再考し、おそらくあなたが正確にそれをしたい理由を明らかにしたいと思います

更新:本当にグループ化が必要な場合に備えて。グループ化しないと、はるかに短い以下の良い答えが見つかるかもしれません。

于 2012-11-16T10:03:19.227 に答える
0

あなたがする必要があるすべてはそれらを分類することです:

val1.Sort();

独自のルールで並べ替える場合は、次のように比較関数を記述します。

static int Compare2String(string a, string b)
{
    var name_a = Path.GetFileNameWithoutExtension(a);
    var name_b = Path.GetFileNameWithoutExtension(b);
    if (name_a.Equals(name_b))
    {
        var ext_a = Path.GetExtension(a);
        var ext_b = Path.GetExtension(b);
        return ext_b.CompareTo(ext_a);
    }
    return name_a.CompareTo(name_b);
}

そして、次のようなソート関数を呼び出します。

val1.Sort((new Comparison<string>(Compare2String)));
于 2012-11-16T09:57:22.967 に答える
-1

GroupByメソッドによって返された結果を破棄しています。IEnumerable<T>このメソッドはインプレースを変更せず、IEnumerable<T>代わりにnewを返します。

var val1 = new List<string> 
{
    "File_1.txt","File_2.txt","File_1_Over.txt","File_2_Item.txt","File_1_Over.bat",
    "File_1_Over_test.bat","File_2_Standard.bat","File_2_Item_Standard.bat"
};

var result = val1.GroupBy(Path.GetFileNameWithoutExtension);

foreach (var item in result)
{
    foreach (var file in item)
    {
        Console.WriteLine(file);
    }
}
于 2012-11-16T09:53:39.827 に答える