c#内存性能和加速比

c#内存性能和加速比,c#,C#,我有一种情况,每次用户按键时,我需要处理20k寄存器的锯齿阵列。我有一个网格,当用户键入时,系统会在网格中显示过滤结果。所以所以我有一个锯齿状数组,里面装满了所有20k寄存器。我有一个列表(对控件来说是全局的),每当用户按下一个键,它就会被清除,只填充过滤后的寄存器,然后显示在网格中 这是密码 the model public struct PlayerLookUpAdapter { [Browsable(false)] public decimal Id

我有一种情况,每次用户按键时,我需要处理20k寄存器的锯齿阵列。我有一个网格,当用户键入时,系统会在网格中显示过滤结果。所以所以我有一个锯齿状数组,里面装满了所有20k寄存器。我有一个列表(对控件来说是全局的),每当用户按下一个键,它就会被清除,只填充过滤后的寄存器,然后显示在网格中

这是密码

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毫秒后才开始过滤,让用户输入几个字符。