C# List OrderBy 创建一个 OutOfMemory 错误

C# List OrderBy creates an OutOfMemory Error

我尝试按动态获得的 属性 对列表进行排序。 当我 运行 我的代码在第一个位置是强度,第二个是范围时,我得到一个 OutOfMemory 错误,但是当我改变顺序时一切正常。

代码:

public enum EffectType
{
    Duration,
    Efficiency,
    Range,
    Strength
}

public List<Modlist> Sort(List<EffectType> filter) {
    return ComboList.OrderByDescending(
        x => x.GetType()
            .GetProperty(filter[0].ToString())
            .GetValue(x, null))
    .ThenByDescending(
        y => y.GetType()
            .GetProperty(filter[1].ToString())
            .GetValue(y, null))
    .ToList();
}

public class Modlist
{
    public List<Mod> Mods { get; set; }
    public float Strength { get; set; }
    public float Range { get; set; }
    public float Duration { get; set; }
    public float Efficiency { get; set; }
}

找不到错误,找了好几天

反射很慢,所以尽可能避免它。
您可以使用这样的值选择器实现相同的效果:

return ComboList
    .OrderByDescending(x => x.Duration)
    .ToList();

在您的情况下,您可以像这样创建一个选择器字典:

private readonly Dictionary<EffectType, Func<Modlist, float>> selectors
    = new Dictionary<EffectType, Func<Modlist, float>>
{
  { EffectType.Duration, m => m.Duration },
  { EffectType.Efficiency, m => m.Efficiency },
  { EffectType.Range, m => m.Range },
  { EffectType.Strength, m => m.Strength }
};

然后将您的枚举项转换为选择器并使用它们:

public List<Modlist> Sort(List<EffectType> filters)
{
    if (filters.Count < 1) // no sort is required
        return ComboList;

    var currentSelectors = filters
        .Select(f => selectors[f])
        .ToArray();

    var sorted = ComboList.OrderByDescending(currentSelectors[0]);
    for (var i = 1; i < currentSelectors.Length; ++i)
        sorted = sorted.ThenByDescending(currentSelectors[i]);

    return sorted.ToList();
}