【问题标题】:Sorting a List<T> when FindAll c#FindAll c# 时对 List<T> 进行排序
【发布时间】:2019-03-12 12:12:53
【问题描述】:

我正在使用返回正确列表的FindAll() 方法

List<AudioSource> playing = AudioSourceRegistry.FindAll(src => src.isPlaying == true);

但是当尝试使用

对列表进行排序时
List<AudioSource> playing = AudioSourceRegistry.FindAll(src => src.isPlaying == true)
    .Sort(delegate (AudioSource a1, AudioSource a2)
    {
        return a1.mixerIndex.CompareTo(a2.mixerIndex);
    }); 

List<AudioSource> playing = AudioSourceRegistry.FindAll(src => src.isPlaying == true)
    .Sort(a1, a2 => a1.mixerIndex.CompareTo(a2.mixerIndex)); 

导致错误

严重性代码描述项目文件行抑制状态 错误 CS0029 无法将类型“void”隐式转换为 'System.Collections.Generic.List'

排序不返回列表?

如何对FindAll() 的结果进行排序?

【问题讨论】:

  • Sort的返回类型是什么?
  • 查看List.Sort的文档

标签: c#


【解决方案1】:

FindAll 返回一个新列表,但 Sort 对列表进行就地排序(因此返回 void)。

你可以这样做:

List<AudioSource> playing = AudioSourceRegistry.FindAll(src => src.isPlaying);
playing.Sort(a1, a2 => a1.mixerIndex.CompareTo(a2.mixerIndex));

或者,您可以使用 Linq 的 OrderBy 而不是 List 的 Sort(它确实返回一个排序的枚举,而不是就地排序)。如果您这样做,则值得使用 Linq 的 Where 而不是 List 的 FindAll,因为这样可以避免创建不必要的中间列表:

List<AudioSource> playing = AudioSourceRegistry
    .Where(src => src.isPlaying)
    .OrderBy(src => src.mixerIndex)
    .ToList();

【讨论】:

  • 如果我使用deelegate方法playing.Sort(delegate (AudioSource a1, AudioSource a2) { return a1.mixerIndex.CompareTo(a2.mixerIndex); });
  • @garrilla 它可能会起作用,但它会改变原始集合,根据您的问题,这不是您所期望的。
  • @vc74 我怀疑他在从FindAll 返回的列表上调用playing.Sort——即我的第一个解决方案——这很好。
猜你喜欢
  • 2019-12-13
  • 2011-06-11
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多