c#内存性能和加速比
我有一种情况,每次用户按键时,我需要处理20k寄存器的锯齿阵列。我有一个网格,当用户键入时,系统会在网格中显示过滤结果。所以所以我有一个锯齿状数组,里面装满了所有20k寄存器。我有一个列表(对控件来说是全局的),每当用户按下一个键,它就会被清除,只填充过滤后的寄存器,然后显示在网格中 这是密码c#内存性能和加速比,c#,C#,我有一种情况,每次用户按键时,我需要处理20k寄存器的锯齿阵列。我有一个网格,当用户键入时,系统会在网格中显示过滤结果。所以所以我有一个锯齿状数组,里面装满了所有20k寄存器。我有一个列表(对控件来说是全局的),每当用户按下一个键,它就会被清除,只填充过滤后的寄存器,然后显示在网格中 这是密码 the model public struct PlayerLookUpAdapter { [Browsable(false)] public decimal Id
the model
public struct PlayerLookUpAdapter
{
[Browsable(false)]
public decimal Id { get; set; }
[DisplayName("Número")]
public String Number { get; set; }
[DisplayName("Nombre")]
public String Name { get; set; }
[DisplayName("Apellido")]
public String Surname { get; set; }
[DisplayName("DNI")]
public String Document { get; set; }
[DisplayName("Estado")]
public String Status { get; set; }
}
private PlayerLookUpAdapter[] _source; // here are the 20k registers
List<PlayerLookUpAdapter> filteredOut = new List<PlayerLookUpAdapter>(); // here the filtered ones
// this code is executed every time the user press a key
private void tb_nro_KeyUp(object sender, KeyEventArgs e)
{
if (!(e.KeyCode.Equals(Keys.Enter) || e.KeyCode.Equals(Keys.Down)) && _source!=null)
{
String text = tb_nro.Text.ToUpper();
if (String.IsNullOrEmpty(text))
{
fg.DataSource = _source;
fg.Refresh();
return;
}
fg.DataSource = null;
filteredOut.Clear();
int length = _source.Length;
for (int i = 0; i < length; i++)
{
PlayerLookUpAdapter cur = _source[i];
if (cur.Number.ToUpper().StartsWith(text) || cur.Surname.ToUpper().StartsWith(text) || cur.Name.ToUpper().StartsWith(text))
filteredOut.Add(cur);
}
fg.DataSource = filteredOut;
SetGridColumnsProperties();
fg.Refresh();
}
else
{
fg.Focus();
}
}
模型
公共结构PlayerLookUpAdapter
{
[可浏览(错误)]
公共十进制Id{get;set;}
[显示名称(“Número”)]
公共字符串编号{get;set;}
[显示名称(“名称”)]
公共字符串名称{get;set;}
[显示名称(“Apellido”)]
公共字符串姓氏{get;set;}
[显示名称(“DNI”)]
公共字符串文档{get;set;}
[显示名称(“Estado”)]
公共字符串状态{get;set;}
}
私人玩家Lookupadapter[]_source;//这是20k寄存器
List filteredOut=新列表();//这里是经过过滤的
//此代码在用户每次按键时执行
私有void tb_nro_KeyUp(对象发送方,KeyEventArgs e)
{
如果(!(e.KeyCode.Equals(Keys.Enter)| | e.KeyCode.Equals(Keys.Down))&&&&(u source!=null)
{
String text=tb_nro.text.ToUpper();
if(String.IsNullOrEmpty(text))
{
fg.DataSource=\u source;
fg.Refresh();
返回;
}
fg.DataSource=null;
filteredOut.Clear();
int length=_source.length;
for(int i=0;i
在内存使用和性能方面,它是一个好的解决方案吗?你有什么建议吗?我怎样才能获得更快的速度。它工作得很好,但是如果我得到的是100k而不是20k寄存器呢
提前感谢。预先计算
ToUpper()
调用,这样您就不必每次都这样做了。您可以维护第二个列表,其中所有字符串都以大写形式存储
其次,如果在搜索字符串中添加了一个键,您应该搜索过滤后的列表(而不是整个列表)。新的(更长的)字符串永远不能超出筛选结果。首先,您可以对代码进行一些改进:StartWith方法有一个重载,它也会进行字符串比较。您可以将其设置为“OrdinalIgnoreCase”以避免将所有字符串置高,但我认为您不会获得太多收益。 你必须加快搜索速度的唯一方法是寻找一个名为Lucene.net的搜索引擎
我认为这应该是使用树的最好例子 如果您将数据放在树中(我实际上不知道C#/.Net是否支持树数据结构,或者您自己动手了) 与在数组中搜索相比,在树中搜索的速度将提高(因为树的搜索速度类似于O(n)=n*log(n))
理论很简单:如果用户键入一个文本,那么树将转到以该文本开头的节点,在该节点上所有可能的其他节点,依此类推。例如:用户键入一个“t”你转到“t”节点,然后他键入一个“e”你转到子节点“te”,还有一些其他子节点,如“test”系统将向用户推荐这些子节点。您可以在字符串比较中使用
StringComparison.OrdinalIgnoreCase
选项,避免在所有字符串上调用touper
理想情况下,首先,您需要根据对程序典型使用情况的最佳估计来决定速度有多慢。毕竟。你想要一个合适的答案
以下是一个实现:
但是如果我得到的是100k而不是20k寄存器呢?
——您比我们更适合尝试。您拥有100k而不是20k寄存器的可能性有多大?没有用户喜欢浏览100000个选项的列表。在显示之前过滤结果集,一次只显示10。我会添加一些代码来过滤后台线程上的数据,以便按键立即返回,让用户继续键入。也只有在100毫秒后才开始过滤,让用户输入几个字符。