Tag: foreach

AutoMapper地图中foreach中的额外迭代

出于某种原因,我在AutoMapper地图定义中使用的循环迭代次数超过应有的范围。 地图定义: Mapper.CreateMap() .BeforeMap((s, d) => { foreach (var platId in s.PlatformIDs) { Platform newPlat = _gameRepository.GetPlatform(platId); d.Platforms.Add(newPlat); } }) .ForMember(dest => dest.BoxArtPath, opt => opt.Ignore()) .ForMember(dest => dest.IndexImagePath, opt => opt.Ignore()) .ForMember(dest => dest.Cons, opt => opt.MapFrom(src => String.Join(“|”, src.Cons))) .ForMember(dest => dest.Pros, opt => opt.MapFrom(src => String.Join(“|”, src.Pros))) .ForMember(dest => dest.LastModified, opt => […]

如果我可以定义一个GetEnumerator,为什么要实现IEnumerable(T)?

更新 :我感谢所有的评论,这些评论基本上都是一致的反对意见。 虽然提出的每一项反对意见都是有效的,但我觉得棺材中的最终指甲是Ani的敏锐观察 ,最终,即使是这个想法表面上提供的一个 微不足道的好处 – 消除样板代码 – 也被这个事实所否定。想法本身需要自己的样板代码。 所以,是的,请相信我说:这将是一个坏主意。 而且只是为了有点挽救我的尊严:我可能是为了争论而玩弄它,但我从来没有真正以这个想法开始出售 – 只是好奇地听到其他人不得不说的话。 诚实。 在你将这个问题视为荒谬之前,我请你考虑以下问题: IEnumerableinheritance自* IEnumerable ,这意味着任何实现IEnumerable通常必须实现IEnumerable.GetEnumerator 和 (显式) IEnumerable.GetEnumerator 。 这基本上等于样板代码。 只要该方法使用MoveNext方法和Current属性返回某种类型的对象,您就可以foreach处理具有GetEnumerator方法的任何类型。 因此,如果您的类型使用签名public IEnumerator GetEnumerator()定义一个方法,则使用foreach枚举它是合法的。 显然,有很多代码需要IEnumerable接口 – 例如,基本上所有的LINQ扩展方法。 幸运的是,使用C#通过yield关键字提供的自动迭代器生成,从可以使用的类型转换为IEnumerable是微不足道的。 所以,把这一切放在一起,我有这个疯狂的想法:如果我只是定义我自己的界面,如下所示: public interface IForEachable { IEnumerator GetEnumerator(); } 然后每当我定义一个我想要枚举的类型时,我实现这个接口而不是IEnumerable ,从而无需实现两个GetEnumerator方法(一个显式)。 例如: class NaturalNumbers : IForEachable { public IEnumerator GetEnumerator() { int i = 1; […]

如何遍历复杂类型对象列表并传递给调用SQL存储过程的方法

如何遍历对象列表以便将所述对象传递给通过存储过程在SQL db中插入行的方法? 在这个问题的帮助下,我达到了这一点: namespace NA.Controllers { public class NC : ApiController { [Route(“AddNote”)] [HttpPost] public HttpResponseMessage PostNote(List items) { //NoteJson deserializednote = JsonConvert.DeserializeObject(item); //Note notesdata = new Note(item); NotesAccept.Models.INoteRepository Repository = new NotesAccept.Models.NoteDataRepository(); foreach (Note item in items) { item = Repository.Add(item); } var response = Request.CreateResponse<List>(HttpStatusCode.OK, items); return response; } } } 但是现在我被卡住了,因为item=现在是一个迭代变量,但我需要将它传递给一个方法: namespace […]

C#foreach on IEnumerable vs. List – 元素修改仅对数组持久 – 为什么?

在C#中,我注意到如果我在LINQ生成的IEnumerable集合上运行foreach循环并尝试修改每个T元素的内容,那么我的修改不会持久。 另一方面,如果在创建集合时应用ToArray()或ToList()方法,则对foreach循环中各个元素的修改是持久的。 我怀疑这在某种程度上与延迟执行有关,但究竟对我来说并不完全是显而易见的。 我真的很感激这种行为差异的解释。 这是一些示例代码 – 我有一个带有构造函数和自动实现属性的类MyClass : public class MyClass { public MyClass(int val) { Str = val.ToString(); } public string Str { get; set; } } 在我的示例应用程序中,我使用LINQ Select()通过最终应用ToList()方法,基于整数集合创建两个MyClass对象集合,一个IEnumerable和一个IList 。 var ints = Enumerable.Range(1, 10); var myClassEnumerable = ints.Select(i => new MyClass(i)); var myClassArray = ints.Select(i => new MyClass(i)).ToList(); 接下来,我在每个集合上运行一个foreach循环,并修改循环的MyClass对象的内容: foreach (var obj in […]

在C#中更新foreach循环中的struct

我有这个代码(C#): using System.Collections.Generic; namespace ConsoleApplication1 { public struct Thing { public string Name; } class Program { static void Main(string[] args) { List things = new List(); foreach (Thing t in things) // for each file { t.Name = “xxx”; } } } } 它不会编译。 错误是: Cannot modify members of ‘t’ because it is a […]

为什么在使用foreach时不执行此LINQ查询?

在LINQ语句中创建新对象时,例如: var list = new List() { “a”, “b”, “c” }; var created = from i in list select new A(); A级看起来像这样: class A { public string Label; } 然后使用foreach循环修改A中的属性: foreach (var c in created) { c.Label = “Set”; } 为什么在访问IEnumerable的对象后未设置值。 例如,以下断言失败: Assert.AreEqual(“Set”, created.ElementAt(2).Label); 我想知道为什么会这样。 我希望foreach语句执行查询,并触发对象的创建。 MSDN文档声明: “查询的执行被推迟,直到在foreach或For Each循环中迭代查询变量” 。 我用.NET 4.5和Mono 3.2.0重现了这种行为。 在访问创建的对象之前在IEnumerable上调用ToList会使这个问题消失。

如何在foreach循环中修改foreach迭代变量?

当我尝试这样做时…… Item[,] array = new Item[w, h]; // Two dimensional array of class Item, // w, h are unknown at compile time. foreach(var item in array) { item = new Item(); } …我得到的Cannot assign to ‘item’ because it is a ‘foreach iteration variable’ 。 不过,我还想那样做。 我们的想法是将默认的Item类值分配给现有项目。

IEnumerable是否需要使用foreach循环?

我想知道,我什么时候可以使用foreach循环? 我必须实现IEnumerable吗?

在条件范围内声明隐式类型变量并在外部使用它

在下面的简化代码中, if(city == “New York City”) { var MyObject = from x in MyEFTable where x.CostOfLiving == “VERY HIGH” select x.*; } else { var MyObject = from x in MyEFTable where x.CostOfLiving == “MODERATE” select x.*; } foreach (var item in MyObject) { Console.WriteLine(“”); } 在条件块之外无法访问变量MyObject。 我怎样才能在if..else之外迭代?

关于foreach和代表的问题

假设以下代码: foreach(Item i on ItemCollection) { Something s = new Something(); s.EventX += delegate { ProcessItem(i); }; SomethingCollection.Add(s); } 当然,这是错误的,因为所有代表都指向同一个项目。 替代方案是: foreach(Item i on ItemCollection) { Item tmpItem = i; Something s = new Something(); s.EventX += delegate { ProcessItem(tmpItem); }; SomethingCollection.Add(s); } 在这种情况下,所有代表都指向他们自己的Item。 这种方法怎么样? 还有其他更好的解决方案吗?