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();
}
我尝试按动态获得的 属性 对列表进行排序。 当我 运行 我的代码在第一个位置是强度,第二个是范围时,我得到一个 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();
}