Max*_*rdt 4 c# bindinglist winforms
我有一个Asynchronous BindingList,它包含在工作线程上操作并绑定到主UI线程上的BindingSource的对象,其中BindingSource绑定到DataGridView.
有没有可能在我的BindingList中找到对象而不迭代列表?
我看过LINQ的引擎盖,它基本上是一个糖涂层的foreach循环.另外从我的理解,如果我实现IBindingList.Find()它只不过是一个for循环...
我已经"尝试"将我的BindingList同步/映射到一个反映我的BindingList的字典,并使用Dictionary来定位对象并将结果(索引)传递给我的BindingList,但这不起作用,因为添加和删除太多了对象和我无法保持井井有条.
这是一款高性能的应用程序,处理来自股票市场的实时高频数据.这就是为什么我不能遍历BindingList,这太低效了.
有人可以给我一些建议和/或解决方案.
所以某种快速查找绑定列表...这是我之前准备的.
这是您提到的"同步/地图"方法.我之前使用过这个快速滴答数据,主要瓶颈是查找列表中的项目.我相信我已经涵盖了保持同步或"有组织"所需的所有方法.你可能会为AddRange添加一个测试 - 我没有反编译器,我不确定它是否只是调用InsertItem.
显然,你在这里有更大的内存使用和插入时间的直接权衡,维护两个列表,但对于快速滴答数据,这通常是一个非常可接受的权衡,以改善查找时间.
像你一样使用类BindingList,但是当你需要快速查找项目时,请使用FastFind方法.
public class FastLookupBindingList<TKey, TVal> : BindingList<TVal>
{
private readonly IDictionary<TKey, TVal> _dict = new Dictionary<TKey, TVal>();
private readonly Func<TVal, TKey> _keyFunc;
public FastLookupBindingList(Func<TVal, TKey> keyFunc)
{
_keyFunc = keyFunc;
}
public FastLookupBindingList(Func<TVal, TKey> keyFunc, IList<TVal> sourceList) : base(sourceList)
{
_keyFunc = keyFunc;
foreach (var item in sourceList)
{
var key = _keyFunc(item);
_dict.Add(key, item);
}
}
public TVal FastFind(TKey key)
{
TVal val;
_dict.TryGetValue(key, out val);
return val;
}
protected override void InsertItem(int index, TVal val)
{
_dict.Add(_keyFunc(val), val);
base.InsertItem(index, val);
}
protected override void SetItem(int index, TVal val)
{
var key = _keyFunc(val);
_dict[key] = val;
base.SetItem(index, val);
}
protected override void RemoveItem(int index)
{
var item = this[index];
var key = _keyFunc(item);
_dict.Remove(key);
base.RemoveItem(index);
}
protected override void ClearItems()
{
_dict.Clear();
base.ClearItems();
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
private void simpleButton1_Click(object sender, EventArgs e)
{
var keyedBindingList = new FastLookupBindingList<int, Person>(p => p.Id)
{
new Person {Id = 1, Name = "Joe"},
new Person {Id = 2, Name = "Josephine"}
};
var person = keyedBindingList.FastFind(2);
var unkonwn = keyedBindingList.FastFind(4);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3270 次 |
| 最近记录: |