私は状況がある、私はユーザーがキーを押すたびに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();
}
}
それはメモリ使用量とパフォーマンスの面で良い解決策はありますか?助言がありますか?どのようにしてより多くのスピードを得ることができますそれは本当にうまくいくが、20kの代わりに100kのレジスタがあればどうなるのだろうか?
ありがとうございます。
'しかし、私が代わりに20Kの100Kのレジスタを得た場合について' - あなたは私たちよりも、それを試してみるためにはるかに良い位置にありますあります。 – sehe
20kではなく100kのレジスタはどれくらいありますか? –
ユーザーは100,000の選択肢のリストを掘り起こすのが好きではありません。結果セット*をフィルタリングする前に*フィルタリングしてください。一度に10件しか表示されません。 –