-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 )

无论如何,我首先希望成为一个 TXT 文件而不是 BAT。

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);
}

并像这样调用 Sort 函数:

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

您正在丢弃该GroupBy方法返回的结果。此方法不会IEnumerable<T>就地修改,而是返回一个新的IEnumerable<T>

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 回答