相关疑难解决方法(0)

在.NET中,哪个循环运行得更快,'for'或'foreach'?

在C#/ VB.NET/.NET中,哪个循环运行得更快,for或者foreach

自从我读了一个for循环工程快于foreach环路很久以前我以为这对所有集合,泛型集合,所有阵列,等真正站在

我搜索谷歌并发现了一些文章,但其中大多数都没有结果(阅读文章的评论)和开放式.

什么是理想的是列出每个场景和相同的最佳解决方案.

例如(只是它应该如何的一个例子):

  1. 迭代1000多个字符串的数组 - for比...更好foreach
  2. 迭代IList(非泛型)字符串 - foreach比...更好for

在网上找到的一些参考文献:

  1. Emmanuel Schanzer的原创宏伟文章
  2. CodeProject FOREACH Vs. 对于
  3. 博客 - foreach或不是foreach,这就是问题
  4. ASP.NET论坛 - NET 1.1 C#forvsforeach

[编辑]

除了可读性方面,我对事实和数据非常感兴趣.有些应用程序的最后一英里性能优化受到挤压很重要.

.net c# performance for-loop

322
推荐指数
20
解决办法
19万
查看次数

"嵌套foreach"vs"lambda/linq查询"性能(LINQ-to-Objects)

从性能的角度来看,你应该使用"嵌套的foreach"或"lambda/linq查询"?

c# foreach lambda linq-to-objects

37
推荐指数
3
解决办法
3万
查看次数

C#编译器选择错误的扩展方法

考虑以下代码:

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)

.net c#

15
推荐指数
1
解决办法
381
查看次数

从存储过程结果创建对象

我们有一个现有的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)

c# linq sql-server stored-procedures

7
推荐指数
1
解决办法
4765
查看次数

如何切换该代码以使用LINQ

我知道使用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的一部分吗?

.net c# linq

5
推荐指数
1
解决办法
148
查看次数

Min() 和 Max() 还是单个老派的 foreach?

如果我有大量收藏并且我关心性能,我是否应该相信奇迹并使用

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)

YICollection<double>,因为我需要Countforeach。我很好奇类型是否正确,因为最小/最大,并且我需要从末尾迭代集合,所以会有

Y.OrderByDescending((o) => o)...
Run Code Online (Sandbox Code Playgroud)

c# linq performance

5
推荐指数
1
解决办法
1293
查看次数

如何在C#中有效地摆脱双循环?

这是我目前用于打破双循环并继续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#中执行此操作的最佳方法是什么?

我一直在做上面这个例子的时间最长,并觉得必须有一个更好的方法 - 在这一点上几乎感到羞愧.

谢谢

c# loops

4
推荐指数
1
解决办法
82
查看次数

我如何在LINQ中写这个?

我确定有一些方法可以在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)

.net c# linq

3
推荐指数
1
解决办法
131
查看次数

将字典转换为C#中的对象列表

我有一本字典:

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> 有人可以帮我利用这个解决方案我的情况请.我也对任何可以消除这种开销的其他解决方案持开放态度.

c# dictionary list

3
推荐指数
2
解决办法
4044
查看次数

使用LINQ to Entities获取最后一个字符索引

我收到错误:

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# linq-to-entities

2
推荐指数
1
解决办法
3955
查看次数