我知道如何使用Action
和Func
在.NET中,但每次我开始,使用我调用的常规旧方法可以实现完全相同的解决方案.
这排除了当一个Action
或者Func
被用作我无法控制的东西的参数时,比如LINQ .Where
.
基本上我的问题是......为什么这些存在?他们给了我什么额外的和新的一个简单的方法不?
我有一个缓存在内存中的DataTable /集合,我想用它作为源来生成自动完成文本框的结果(当然使用AJAX).我正在评估各种选项以快速获取数据.数据表中集合/行中的项目数可以从10000到2,000,000不等.(因此,我们不会转移,暂时假设已做出决定,我有足够的RAM,我将使用缓存而不是数据库查询)
我有一些额外的业务逻辑用于此处理; 我必须priority
根据集合中的列(int)确定自动完成列表的优先级.因此,如果我有人搜索Micro
并且我会说出20个以单词/句子开头的结果,Micro
那么我会选择具有最高优先级的前10个结果项.(因此需要具有与字符串值相关联的优先级属性).
集合项已按字母顺序排序.
在这种情况下,什么是最好的解决方案.
1.使用DataTable.Select(
2. 使用DataTable.Rows.Find( .
3.使用自定义集合与的foreach或通过其值进行迭代.
4.使用泛型集合与匿名委托或lambda(因为两者给予同样的性能或不?)
我假设lambda functions
,delegates
并且anonymous functions
使用相同的主体将具有相同的"速度",但是,运行以下简单程序:
static void Main(string[] args)
{
List<int> items = new List<int>();
Random random = new Random();
for (int i = 0; i < 10000000; i++)
{
items.Add(random.Next());
}
Stopwatch watch;
IEnumerable<int> result;
Func<int, bool> @delegate = delegate(int i)
{
return i < 500;
};
watch = Stopwatch.StartNew();
result = items.Where(@delegate);
watch.Stop();
Console.WriteLine("Delegate: {0}", watch.Elapsed.TotalMilliseconds);
Func<int, bool> lambda = i => i < 500;
watch = Stopwatch.StartNew();
result = items.Where(lambda);
watch.Stop();
Console.WriteLine("Lambda: {0}", …
Run Code Online (Sandbox Code Playgroud) 我做了一个小实验来测试lamdba表达式是否可以检索比foreach语句更快的结果.但是,Lambda失败了
System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
st.Start();
List<int> lst = new List<int>();
foreach (GridViewRow item in GridView1.Rows)
{
if (((CheckBox)item.FindControl("Check")).Checked)
{
lst.Add(Convert.ToInt32(((Label)item.FindControl("Id")).Text));
}
}
st.Stop();
Response.Write(st.Elapsed.ToString());
Response.Write("<br/><br/><br/>");
st.Reset();
st.Start();
List<int> lstRank = GridView1.Rows.OfType<GridViewRow>().Where(s => ((CheckBox)s.FindControl("Check")).Checked)
.Select(s => Convert.ToInt32(((Label)s.FindControl("Id")).Text)).ToList();
st.Stop();
Response.Write(st.Elapsed.ToString());
int i = 0;
output
00:00:00.0000249
00:00:00.0002464
Run Code Online (Sandbox Code Playgroud)
为什么lambda比foreach慢.这可能是lambda表达式的缺点
我最近发现了LINQ,我发现它非常有趣.目前我有以下功能,我不确定它是否会更高效,毕竟产生相同的输出.
你能告诉我你对此的看法吗?
该函数只是以一种非常简单的方式删除标点符号:
private static byte[] FilterText(byte[] arr)
{
List<byte> filteredBytes = new List<byte>();
int j = 0; //index for filteredArray
for (int i = 0; i < arr.Length; i++)
{
if ((arr[i] >= 65 && arr[i] <= 90) || (arr[i] >= 97 && arr[i] <= 122) || arr[i] == 10 || arr[i] == 13 || arr[i] == 32)
{
filteredBytes.Insert(j, arr[i]) ;
j++;
}
}
//return the filtered content of the buffer
return filteredBytes.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
LINQ替代方案:
private static byte …
Run Code Online (Sandbox Code Playgroud)