在C#/ VB.NET/.NET中,哪个循环运行得更快,for
或者foreach
?
自从我读了一个for
循环工程快于foreach
环路很久以前我以为这对所有集合,泛型集合,所有阵列,等真正站在
我搜索谷歌并发现了一些文章,但其中大多数都没有结果(阅读文章的评论)和开放式.
什么是理想的是列出每个场景和相同的最佳解决方案.
例如(只是它应该如何的一个例子):
for
比...更好foreach
IList
(非泛型)字符串 - foreach
比...更好for
在网上找到的一些参考文献:
foreach
或不是foreach
,这就是问题for
vsforeach
[编辑]
除了可读性方面,我对事实和数据非常感兴趣.有些应用程序的最后一英里性能优化受到挤压很重要.
从性能的角度来看,你应该使用"嵌套的foreach"或"lambda/linq查询"?
考虑以下代码:
using System.Linq;
namespace ExtensionMethodIssue
{
static class Program
{
static void Main(string[] args)
{
var a = new[] { 1 };
var b = new[] { 1, 2 }.Where(a.Contains).ToList();
var c = new[] { 1, 2 }.Where(i => a.Contains(i)).ToList();
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码编译成功.然后我添加了nuget包"itext7 7.0.4",现在编译失败的原因是:
//Error CS0122: 'KernelExtensions.Contains<TKey, TValue>(IDictionary<TKey, TValue>, TKey)' is inaccessible due to its protection level
var b = new[] { 1, 2, 3 }.Where(a.Contains).ToList();
// This is still ok.
var c = new[] { 1, 2, 3 …
Run Code Online (Sandbox Code Playgroud) 我们有一个现有的SQL Server存储过程以及以下查询.我们需要Student
从查询结果中创建以下类设计中的对象集合.
从SqlDataReader
使用中创建对象的最佳方法是什么LINQ
?
注意:我SqlDataReader
只使用; 没有ORM
询问
SELECT
S.StudentID, S.StudentName, E.ExamID, E.ExamName, SE.Mark
FROM
StudentExam SE
INNER JOIN
Student S ON S.StudentID = SE.StudentID
INNER JOIN
Exam E ON E.ExamID = SE.ExamID
Run Code Online (Sandbox Code Playgroud)
类
public class ExamMark
{
public int ExamID { get; set; }
public string ExamName { get; set; }
public int Mark { get; set; }
}
public class Student
{
public int StudentID { get; set; }
public string StudentName …
Run Code Online (Sandbox Code Playgroud) 我知道使用LINQ而不是迭代循环是好的做法,我可以修改此代码以使用LINQ吗?
List<string> priorsLstIDs = ServiceUtil.extractColumnValuesAsStringVals(tqrPriors,Helper.STUDY_ID);
List<DateTime> priorsLstDates = ServiceUtil.extractColumnValuesAsDateTimeVals(tqrPriors, "STUDY_DATE");
List<PriorElemSt> priorsElemLst = new List<PriorElemSt>(priorsLstIDs.Count);
PriorElemSt elem;
for (int i = 0; i < priorsLstIDs.Count; i++)
{
elem = new PriorElemSt(priorsLstIDs[i], priorsLstDates[i]);
priorsElemLst.Add(elem);
}
return filterStudyPriors(priorsElemLst);
Run Code Online (Sandbox Code Playgroud)
谢谢.
更新:filterStudyPriors()
方法调用可以成为LINQ的一部分吗?
如果我有大量收藏并且我关心性能,我是否应该相信奇迹并使用
var min = Y.Min();
var max = Y.Max();
Run Code Online (Sandbox Code Playgroud)
或者我最好成为一名优秀的工程师并使用
var max = double.NegativeInfinity;
var min = double.PositiveInfinity;
foreach(var y in Y)
{
if(y > max)
max = y;
if(y < min)
min = y;
}
Run Code Online (Sandbox Code Playgroud)
Y
是ICollection<double>
,因为我需要Count
和foreach
。我很好奇类型是否正确,因为最小/最大,并且我需要从末尾迭代集合,所以会有
Y.OrderByDescending((o) => o)...
Run Code Online (Sandbox Code Playgroud) 这是我目前用于打破双循环并继续DoStuff()的方法:
foreach (var enemyUnit in nearbyEnemyUnits) {
var skip = false;
foreach (var ownUnit in ownUnits) {
if (ownUnit.EngagedTargetTag == enemyUnit.tag) {
skip = true;
break;
}
}
if (skip) continue;
DoStuff(enemyUnit);
}
Run Code Online (Sandbox Code Playgroud)
整个"定义一个临时的布尔变量以检查跳过"对我来说似乎非常hacky.在像Go这样的语言中,我可以使用标签来突破循环,甚至可以使内部循环成为clojure的一部分.在C#中执行此操作的最佳方法是什么?
我一直在做上面这个例子的时间最长,并觉得必须有一个更好的方法 - 在这一点上几乎感到羞愧.
谢谢
我确定有一些方法可以在Linq中编写此代码.但我是LINQ的新手,不知道怎么做?这是代码:
List<IEntityMITARBEITER> leiter = new List<IEntityMITARBEITER>();
foreach (IEntityMITARBEITER mitarbeiter in mit)
{
foreach (IEntityREF_SCHULLUNG refs in refSchullung)
{
if (refs.Id_person == mitarbeiter.Id_mit)
{
leiter.Add(mitarbeiter);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一本字典:
Dictionary<string, string> valuesDict = new Dictionary<string, string> {
{“Q1”, “A1”},
{“Q2”, “A2”},
{“Q3”, “A3”},
{“Q4”, “A4”} /*20000 Q and A pairs*/
};
Run Code Online (Sandbox Code Playgroud)
为了将其加载到仅接受对象列表(类QuestionAnswer)的第三方接口,我手动将其转换为如此列表
Public Class QuestionAnswer {
Public string Question;
Public string Answer;
}
Run Code Online (Sandbox Code Playgroud)
然后在循环内创建QuestionAnswer类的对象
List<QuestionAnswer> qaList = new List<QuestionAnswer>();
foreach(var key in valuesDict.Keys) {
qaList.add(new QuestionAnswer {Question = key, Answer = valuesDict[key]});
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更快的方法从字典中填充此列表.
到目前为止我发现了什么: 在寻找解决方案时,我遇到了一个简单的Dictionary转换为简单类型列表的解决方案,如下所示:将字典转换为List <KeyValuePair> 有人可以帮我利用这个解决方案我的情况请.我也对任何可以消除这种开销的其他解决方案持开放态度.
我收到错误:
LINQ to Entities does not recognize the method 'Int32 LastIndexOf(System.String)'
method, and this method cannot be translated into a store expression.
Run Code Online (Sandbox Code Playgroud)
使用此代码判断某人的姓氏是否以某些字符开头时:
persons = persons.Where(c => c.FullName.IndexOf(" ") > 0 &&
c.FullName.Substring(c.FullName.LastIndexOf(" ")+1).StartsWith(lastNameSearch));
Run Code Online (Sandbox Code Playgroud)
任何线索如何在不使用LastIndexOf()的情况下实现这一目标?也许在使用ToList()从数据库中获取结果后,我必须检查这个?
c# ×10
.net ×4
linq ×4
performance ×2
dictionary ×1
for-loop ×1
foreach ×1
lambda ×1
list ×1
loops ×1
sql-server ×1