绑定到IEnumerable而不是IList,这可能是低效的 - 它效率有多低?

时间:2013-06-12 16:47:49

标签: mvvmcross

为了找到MvvmCross中缺少RelativeSource的遍历,我使用了Stuart的建议并实现了WrappingList MVVMCross changing ViewModel within a MvxBindableListView

但是,我看到这个跟踪它发生的每一个绑定,我想知道,它有多糟糕:

  

绑定到IEnumerable而不是IList - 这可能是低效的,   特别是对于大型名单

也许有其他建议吗?

   public class WrappingCommandsList<T> : IList<WrappingCommandsList<T>.Wrapped>
{
    private readonly List<T> _realList;
    private readonly Action<T> _realActionOnClick;

    public class Wrapped 
    {
        public IMvxCommand ClickCommand { get; set; }
        public T TheItem { get; set; }
    }

    public WrappingCommandsList(List<T> realList, Action<T> realActionOnClick)
    {
        _realList = realList;
        _realActionOnClick = realActionOnClick;
    }

    private Wrapped Wrap(T item)
    {
        return new Wrapped()
        {
            ClickCommand = new MvxCommand(() => _realActionOnClick(item)),
            TheItem = item
        };
    }

    public WrappingCommandsList<T>.Wrapped this[int index]
    {
        get
        {
            return Wrap(_realList[index]);
        }
        set
        {
            throw new NotImplementedException();
        }
    }

    public int Count
    {
        get { return _realList.Count; }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public IEnumerator<WrappingCommandsList<T>.Wrapped> GetEnumerator()
    {
        foreach (var item in _realList)
        {
            yield return Wrap(item);
        }
    }

1 个答案:

答案 0 :(得分:2)

低效率取决于列表的长度以及使用滚动的距离。

例如,如果用户在屏幕上显示项目93,256,那么列表适配器找到项目93,256的唯一方法是获取枚举器并调用MoveNext 93,256次。

如果您的列表只有5个项目,则问题以5为限。

对于您的特定WrappingCommandsList尝试实施IList以及IList<T> - 由于xamarin.ios AoT编译,mvx代码无法在运行时生成IList<T>个访问者限制。