Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果使用IEnumerable,则无法正确分组字符串<;T>;。C中的GroupBy#_C#_Asp.net Mvc 3 - Fatal编程技术网

C# 如果使用IEnumerable,则无法正确分组字符串<;T>;。C中的GroupBy#

C# 如果使用IEnumerable,则无法正确分组字符串<;T>;。C中的GroupBy#,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,假设我有以下文件 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_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_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
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);
}
我在上编写了代码(请参阅我的代码直播:)


无论如何,我希望第一次出现时是一个TXT文件,而不是BAT。

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

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);
    }
}
var val1=新列表
{
“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项目)
{
foreach(项目中的var文件)
{
Console.WriteLine(文件);
}
}

您需要做的一切就是对它们进行排序:

val1.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
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)));
val1.Sort((新的比较(Compare2String));

要真正确保它是您想要的,您可以这样做:

不过,我会重新考虑你的任务,也许会明确你为什么要这么做


更新:如果你真的需要分组。如果没有分组,您可能会在下面找到短得多的好答案。

GroupBy
返回一个
IEnumerable
,但您将其丢弃。看看如果您使用
val1=val1.GroupBy(…),它是否工作得更好取而代之。(因为我现在没有时间验证,所以没有把它作为正确的答案写出来。)你是在分组而不是排序。这真的是你想要做的吗?@MichaelKjörling
val1=val1.GroupBy(…)不会compile@L.B所以
var val2=val1.GroupBy()
?或者将其放入初始
var1
赋值中。@Dmitryletonsov:如果第一个文件显示为BAT会发生什么?我想成为第一个TXT不会
val1.OrderBy(f=>Path.GetFileNameWithoutExtension(f))。然后通过降序(f=>Path.GetExtension(f))
变得更简单?你必须在组内排序。您的任务是对组本身进行排序。一种简单的方法是,在排序时控制分组选择什么,这很奇怪,因为当我测试它时,它起作用了。(也看不到GroupBy)我明白你的意思,你根本不会分组。当然,这是最简单的形式。但目前还不清楚蛇眼是否需要分组