Tag: foreach

c#中最有效的循环是什么

有许多不同的方法可以通过c#中的对象项来完成相同的简单循环。 这让我想知道是否有任何理由表现或使用方便,以至于使用在另一方面。 或者仅仅是个人偏好。 拿一个简单的对象 var myList = List; 让我们假设对象已填充,我们想迭代这些项目。 方法1。 foreach(var item in myList) { //Do stuff } 方法2 myList.Foreach(ml => { //Do stuff }); 方法3 while (myList.MoveNext()) { //Do stuff } 方法4 for (int i = 0; i < myList.Count; i++) { //Do stuff } 我想知道的是,每个编译成同样的东西? 使用一个比其他人有明显的性能优势吗? 或者这只是编码时的个人偏好? 我错过了吗?

多个线程从同一个文件读取

我有一个需要多次读取的xml文件。 我正在尝试使用Parallel.ForEach来加速这个过程,因为没有读入的数据与它被读入的顺序有关。数据只是用于填充对象。 我的问题是即使我每次在线程中打开文件只读它抱怨它是由另一个程序打开。 (我没有在文本编辑器中打开它或任何东西:)) 如何从同一个文件中完成多次读取? 编辑:文件大约是18KB。 它读取大约1800次。 谢谢

LINQ副作用

是否有可能用LINQ( .Select)的lambda表达式替换foreach循环? List l = {1, 2, 3, 4, 5}; foreach (int i in l) Console.WriteLine(i); 至: List l = {1, 2, 3, 4, 5}; l.Select(/* print to console */);

是否更好的编码实践来定义foreach之外的变量,即使更冗长?

在以下示例中: 第一个似乎更冗长但更少浪费资源 第二个是更简洁但更浪费资源(重新定义每个循环的字符串) 哪种编码更好? 第一个例子: using System; using System.Collections.Generic; namespace TestForeach23434 { class Program { static void Main(string[] args) { List names = new List { “one”, “two”, “two”, “three”, “four”, “four” }; string test1 = “”; string test2 = “”; string test3 = “”; foreach (var name in names) { test1 = name + […]

在C#中关闭循环变量

从这篇文章中,我被告知下面的代码部分遭受了“关闭循环变量的令人震惊的行为”。 foreach (Canidate canidate in allCanidates) { Thread newThread = new Thread(delegate() { BusyWait(canidate); }); newThread.Start(); } 我把它换成了这个: foreach (Canidate canidate in allCanidates) { var can = canidate; Thread newThread = new Thread(delegate() { BusyWait(can); }); newThread.Start(); } 但是我的老板一直坚称它会遭遇同样的问题。 我使用此链接尝试解决此问题。 有人可以帮我正确解决问题,以便我的代码能够正确执行。 这个问题对我来说都是新的,我不确定我是否完全理解它。

foreach纯粹是“语法糖”吗?

当foreach与数组一起使用时,编译器将foreach循环编译为类似for循环的东西。 当foreach与IEnumerable或IEnumerable一起使用时,编译器会将foreach循环编译为类似while循环的东西。 那么这是否意味着foreach纯粹是syntactic sugar ? 或者有什么复杂的东西吗? CLR是否了解foreach ? 在MSIL代码中是否有专门针对foreach设计的内容?

C#中的lambda如何绑定到foreach中的枚举器?

我刚刚遇到了最意想不到的行为。 我确信这有一个很好的理由。 有人可以帮忙解释一下吗? 考虑以下代码: var nums = new int[] { 1, 2, 3, 4 }; var actions = new List<Func>(); foreach (var num in nums) { actions.Add(() => num); } foreach (var num in nums) { var x = num; actions.Add(() => x); } foreach (var action in actions) { Debug.Write(action() + ” “); } […]

锁定与ToArray的线程安全foreach访问List集合

我有一个List集合,我想在multithreading应用程序中迭代它。 我需要在每次迭代时保护它,因为它可以被更改,而且当我做foreach时我不想要“收集被修改”的exception。 这样做的正确方法是什么? 每次访问或循环时都使用锁定。 我对死锁感到十分害怕。 也许我只是偏执使用锁而不应该。 如果我走这条路以避免死锁,我需要知道什么? 锁是否相当有效? 每次我做foreach时,使用List 。ToArray()复制到数组。 这会导致性能下降,但很容易做到。 我担心内存颠簸以及复制它的时间。 看起来过分了。 使用ToArray是否安全? 不要使用foreach而是使用for循环。 每次我这样做以确保列表没有收缩时,我不需要进行长度检查吗? 这看起来很烦人。

在foreach循环中更改对象值?

在一个地方,我正在使用字符串列表,在这种情况下,我能够将字符串的值更改为下面给出的代码, foreach(string item in itemlist.ToList()) { item=someValue; //I am able to do this } 但是对于类的对象,我无法改变对象的成员值,代码如下, public class StudentDTO { string name; int rollNo; } studentDTOList=GetDataFromDatabase(); foreach(StudentDTO student in studentDTOList.ToList()) { studentDTO=ChangeName(studentDTO); //Not working } private StudentDTO ChangeName(StudentDTO studentDTO) { studentDTO.name=SomeName; return studentDTO; } 错误是:无法分配,因为它是迭代变量

通过正则表达式匹配循环

这是我的源字符串: 这是我的Regex Patern: <(?\w+?)><(?\d+?)> 这是我的Item类 class Item { string Name; int count; //(…) } 这是我的物品collections; List OrderList = new List(Item); 我想根据源字符串使用Item填充该列表。 这是我的function。 它不起作用。 Regex ItemRegex = new Regex(@”<(?\w+?)><(?\d+?)>”, RegexOptions.Compiled); foreach (Match ItemMatch in ItemRegex.Matches(sourceString)) { Item temp = new Item(ItemMatch.Groups[“item”].ToString(), int.Parse(ItemMatch.Groups[“count”].ToString())); OrderList.Add(temp); } Threre可能是一些小错误,比如在这个例子中丢失字母,因为这是我在我的应用程序中更容易的版本。 问题是,最后我在OrderList中只有一个Item。 UPDATE 我搞定了。 寻求帮助。