考虑下面的代码片段:属性中的LINQ Getter - 性能差?
private List<object> MyList;
public List<object> SubSetOfList
{
get { return MyList.Where(p => p.Property == SomeValue).ToList(); }
}
这是访问的子集,我感兴趣的列表的一个非常方便的方式。然而,我想它可能不会在性能方面扩展这么好。
我考虑的另一种模式如下。我不在乎这个,但是因为随着我感兴趣的子集数量的增加,它在复杂度方面出现了扩展问题。
private List<object> _myList;
public List<object> WholeList
{
get { return _myList; }
}
private List<object> _valueAList;
public List<object> ValueAList
{
get { return _valueAList; }
}
private List<object> _valueBList;
public List<object> ValueBList
{
get { return _valueBList; }
}
public void AddItem(object obj)
{
_myList.Add(obj);
if (obj.SomePropety == valueA)
_valueAList.Add(obj);
if (obj.SomePropety == valueB)
_valueBList.Add(obj);
}
是否有普遍接受的模式或模式来处理这种行为?
无性能要求“不过,我想这可能不会在性能方面扩展这么好。” - 我认为你应该真正地分析你的应用程序,看看在真正的问题之前放弃可读解决方案的复杂性。 – Jens
了解您正在使用的LINQ提供程序(例如对象,实体框架)以及您期望访问此属性的频率会很有用。通常,通过缓存ToList的结果并在随后的调用中返回缓存版本,您可以缓解此方法的任何性能问题。 –
即使在SubSetOfList中有一个固定值,也可以不用'ToList'执行查询。你也不应该将财产用于“昂贵”的东西。然后使用带有参数的方法。 –