解决 数组分类

MPIon

新成员
已加入
2020年6月13日
留言内容
4
地点
英国
编程经验
10+
我是这个论坛的新手,不确定这是否是发布此帖子的正确位置,但我对Array.Sort遇到了问题
我有一堂课
C#:
public class FileList
{
    public string path;
    public bool isFolder;
}
以及设置为此类的数组:-
C#:
public static FileList[] fileList = new FileList[1000];

for (int i = 0; i < 1000; i++)
    fileList = new FileList();

我现在想对这个类和下面我在互联网上使用的示例进行排序:-
C#:
Array.Sort(fileList, (x, y) => string.Compare(x.path, y.path));
这行得通,但我想限制为仅对某些元素进行排序,因此尝试了
C#:
Array.Sort(fileList, 0, 10, (x, y) => string.Compare(x.path, y.path));
这给出了两个编译错误:
参数2,无法从int转换为系统数组

无法将lambda表达式转换为int类型,因为它不是委托类型。
无法理解这意味着什么,或者无法在互联网上找到任何可能解释这里出问题的帮助。我想我可能需要写点东西
ICompare例程,但我发现的所有示例都没有引用Class的一个元素。

我敢肯定,必须有一个简单的解决方案,而不必重新发明轮子。
 
由主持人最后编辑:

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果第一个工作,第二个也应该工作,但是我正在小屏幕上阅读此内容,并上下滚动,所以我可能会丢失一些东西。

出于好奇,您似乎只想对前10个项目进行排序。您是否打算保留其他990件物品完好无损?还是您不在乎其余的?
 

MPIon

新成员
已加入
2020年6月13日
留言内容
4
地点
英国
编程经验
10+
如果第一个工作,第二个也应该工作,但是我正在小屏幕上阅读此内容,并上下滚动,所以我可能会丢失一些东西。

出于好奇,您似乎只想对前10个项目进行排序。您是否打算保留其他990件物品完好无损?还是您不在乎其余的?
谢谢回复。是的,我也认为第二个应该已经工作了,因为我认为这是Array.Sort方法的重载。
我只想对数组中填充的条目进行排序-10仅是示例。发生的事情是所有空条目都在列表中排在首位,但是我对它们不感兴趣。
我现在正在考虑使用列表,并且仅在需要时才向其中添加项目。不知道这有多有效。也许比使用动态大小的数组更有效。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
第一个有效的代码正在使用 这种超载。第二个参数是type 比较<T>。那是该类型参数的唯一重载,因此当然可以使用参数和参数的任何其他组合来调用该方法。 比较<T> 将无法正常工作。您尝试调用的超载需要一个 比较器<T>,表示具有执行相同比较方法的类的实例,例如
C#:
public class FileListPathComparer : IComparer<FileList>
{
    public int Compare(FileList x, FileList y)
    {
        return string.Compare(x.path, y.path);
    }
}
和:
C#:
Array.Sort(fileList, 0, 10, new FileListPathComparer());
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
不知道这有多有效。也许比使用动态大小的数组更有效。
它是。实际上,List<T> 在内部使用数组,并会根据需要动态调整其大小,但使用专门旨在提高效率的算法。这 容量 是内部数组的大小,每次需要更多空间时都会加倍。这样,较大的列表就需要较少的调整大小。如果您对最终尺寸会有所了解,可以在创建尺寸时指定容量 列表<T> 然后无需调整大小。列表对象看起来仍然和您从外部添加的项目一样大。所有空数组元素均由该类自动管理。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
或使用 比较器<T>.Create()。得到类似的东西:
C#:
Array.Sort(fileList, 0, 10, Comparer<FileList>.Create((x, y) => string.Compare(x.path, y.path)));

And yes, definitely prefer to use a 列表<T> rather than an array.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
Or use 比较器<T>.Create()。得到类似的东西:
C#:
Array.Sort(fileList, 0, 10, Comparer<FileList>.Create((x, y) => string.Compare(x.path, y.path)));

And yes, definitely prefer to use a 列表<T> rather than an array.
不知道那堂课。在极少数情况下,我总是需要直接实现接口的功能。那不是很繁琐,所以没什么大不了的,但是我仍然希望我能意识到。
 

MPIon

新成员
已加入
2020年6月13日
留言内容
4
地点
英国
编程经验
10+
第一个有效的代码正在使用 这种超载。第二个参数是type 比较<T>。那是该类型参数的唯一重载,因此当然可以使用参数和参数的任何其他组合来调用该方法。 比较<T> 将无法正常工作。您尝试调用的超载需要一个 比较器<T>,表示具有执行相同比较方法的类的实例,例如
C#:
public class FileListPathComparer : IComparer<FileList>
{
    public int Compare(FileList x, FileList y)
    {
        return string.Compare(x.path, y.path);
    }
}
和:
C#:
Array.Sort(fileList, 0, 10, new FileListPathComparer());
谢谢J,
这似乎解决了。我将使用列表而不是数组。可以做任何一个,因为数组很小,不需要这样做。
尝试新事物还是不错的。有很多东西要学习。
 

MPIon

新成员
已加入
2020年6月13日
留言内容
4
地点
英国
编程经验
10+
Or use 比较器<T>.Create()。得到类似的东西:
C#:
Array.Sort(fileList, 0, 10, Comparer<FileList>.Create((x, y) => string.Compare(x.path, y.path)));

And yes, definitely prefer to use a 列表<T> rather than an array.
是的,我现在已经使用列表启动并运行了代码,并且不需要将排序限制为10或占用的其他任何内容,因为列表仅包含填充项。
谢谢,如果我能弄清楚该怎么做,我将这个线程标记为“已解决”。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
Thanks J,
这似乎解决了。我将使用列表而不是数组。可以做任何一个,因为数组很小,不需要这样做。
尝试新事物还是不错的。有很多东西要学习。
有人建议不要使用数组,因为 列表<T> 更灵活,但对我而言总是愚蠢的。您应该始终使用最合适的工具来完成手头的工作。如果您需要一个永远不会改变的项目列表,那么数组是最好的工具,因为这样做的开销最少。如果列表将更改,则 列表<T> 更好,因为它使您可以使用最易读和可维护的代码高效地执行此操作。几乎总是也有一个灰色区域。例如,如果您的列表会更改一次,但您不知道更改多少,则谨慎使用数组并自行调整大小。这样,您将始终只使用所需的空间。如果您使用了 列表<T>,您可能最终还是要调整内部数组的大小,然后使用比实际需要的数组大得多的数组。
 
Last edited:
最佳 底部