gpt4 book ai didi

c# - 在 BindingList 中定位对象

转载 作者:太空狗 更新时间:2023-10-30 01:08:23 31 4
gpt4 key购买 nike

我有一个异步 BindingList,其中包含在工作线程上操作并绑定(bind)到主 UI 线程上的 BindingSource 以及绑定(bind)到 DataGridView 的 BindingSource 的对象。

是否可以在不遍历列表的情况下在我的 BindingList 中定位对象?

我深入了解了 LINQ,它基本上是一个糖衣 foreach 循环。另外根据我的理解,如果我实现 IBindingList.Find() 它只不过是一个 for 循环......

我已经“尝试”将我的 BindingList 同步/映射到镜像我的 BindingList 的字典,并使用字典定位对象并将结果(索引)传递到我的 BindingList 但这不起作用,因为太多了添加和删​​除对象,我无法使事情井井有条。

这是一款高性能应用,可处理来自股票市场的实时高频数据。这就是我无法遍历 BindingList 的原因,它的效率太低了。

有人可以给我一些建议和/或解决方案吗。

最佳答案

所以某种快速查找绑定(bind)列表...这是我之前准备的一个。

这是您提到的“同步/映射”方法。我之前将其用于快速滴答数据,其中主要瓶颈是在列表中查找项目。我相信我已经涵盖了保持同步或“有条理”所需的所有方法。您可以为 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();
}
}

用法:

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);
}

关于c# - 在 BindingList 中定位对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9576383/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com