Tag: ienumerable

为什么ICollection 同时实现IEnumerable 和IEnumerable

为什么ICollection实现IEnumerable和IEnumerable ? 这样做的目的是什么? IEnumerable如何使ICollection受益?

使用IReadOnlyCollection 而不是IEnumerable 来获取参数,以避免可能的多次枚举

我的问题与关于使用IEnumerable vs IReadOnlyCollection 。 我也总是使用IEnumerable将集合作为返回类型和参数公开,因为它既可以是不可变的又是懒惰的执行。 但是,我越来越关注我的代码中的地方的扩散,我必须枚举一个参数,以避免ReSharper给出的可能的多个枚举警告。 我理解为什么ReSharper建议这一点,我同意它建议的代码(下面)以确保封装(即,没有关于调用者的假设)。 Foo[] arr = col as Foo[] ?? col.ToArray(); 但是,我发现此代码的重复性是污染性的,并且我同意一些消息来源IReadOnlyCollection是一个更好的选择,特别是本文中提出的观点,其中指出: 最近,我一直在考虑返回IEnumerable的优点和缺点。 从好的方面来说,它与接口得到的一样小,所以它让你作为方法作者更灵活,而不是像IList或( 天堂禁止 )一个更重的替代方案。 但是,正如我在上一篇文章中所概述的那样, IEnumerable返回会诱使调用者违反Liskov替换原则 。 他们很容易使用像Last()和Count()这样的LINQ扩展方法,其语义IEnumerable不承诺。 我们需要的是一种更好的方法来锁定一个返回的集合,而不会让这样的诱惑如此突出。 (我想起Barney Fife艰难地学习这一课。) 输入IReadOnlyCollection ,.NET 4.5中的新增function。 它只向IEnumerable添加一个属性: Count属性。 通过承诺计数,你向你的呼叫者保证你的IEnumerable确实有一个终点。 然后他们可以清楚地使用像Last()这样的LINQ扩展方法。 但是,正如观察者可能已经注意到的那样,本文仅讨论如何将IReadOnlyCollection用于返回类型。 我的问题是,相同的论点同样适用于将其用于参数吗? 对此的任何理论思考或评论也将受到赞赏。 事实上,我正在考虑使用IReadOnlyCollection的一般经验法则是,如果使用IEnumerable可能会有多次枚举(相对于ReSharper警告)。 否则,使用IEnumerable 。

什么具体类型’收益率’回报?

这个IEnumerable的具体类型是什么? private IEnumerable GetIEnumerable() { yield return “a”; yield return “a”; yield return “a”; }

IEnumerable 和。Where Linq方法的行为?

我以为我知道关于IEnumerable一切,但我刚遇到一个我无法解释的案例。 当我们调用。在IEnumerable上使用linq方法时,执行被推迟到对象被枚举,不是吗? 那么如何解释下面的示例: public class CTest { public CTest(int amount) { Amount = amount; } public int Amount { get; set; } public override string ToString() { return $”Amount:{Amount}”; } public static IEnumerable GenerateEnumerableTest() { var tab = new List { 2, 5, 10, 12 }; return tab.Select(t => new CTest(t)); } } 到目前为止没什么不好的! 但是下面的测试给了我一个意想不到的结果,虽然我对IEnumerable和.Where […]

如何在C#中访问IEnumerable对象中的索引?

我有一个IEnumerable对象。 我想基于索引访问例如: for(i=0; i<=Model.Products; i++) { ??? } 这可能吗?

LINQ Single()0或多个项目的例外

我有一些IEnumberable项目集合。 我使用.Single()来查找集合中的特定对象。 我选择使用Single()因为只应该有一个特定的项目。 但是,如果不存在,那么我需要创建它并将其添加到集合中。 我的问题是如果没有与谓词匹配的项目或者有多个项目, Single()会抛出相同的错误。 我的想法是将Single()调用放在try中并捕获exception,添加项目,然后继续。 但是,由于两种情况都会抛出InvalidOperationException ,如何判断它是否由于没有项目或多项? 我知道我可以使用First()但这并没有强制说应该只有一个(没有做额外的工作)。 我也可以在Single()调用之前使用Count() ,但这似乎只是破坏了Single()的要点

IEnumerable vs T

我只是意识到,在将T[]暴露给我的视图时,我可能总是错了,而不是IEnumerable 。 通常,对于这种代码: foreach (var item in items) {} item应该是T[]还是IEnumerable ? 如果我需要得到项目的计数,那么Array.Count会比IEnumerable.Count()更快吗?

IEnumerable是否需要使用foreach循环?

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

将IEnumerable 转换为IEnumerable ?

以下符合但在运行时抛出exception。 我想要做的是将类PersonWithAge强制转换为Person类。 我该怎么做以及解决方法是什么? class Person { public int Id { get; set; } public string Name { get; set; } } class PersonWithAge { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { IEnumerable […]

使用Linq将DataTable分解为固定大小的块的简洁方法是什么?

更新:这是一个类似的问题 假设我有一个DataTable ,里面有几千个DataRows 。 我想将表拆分成较小行的块进行处理。 我认为C#3改进的数据处理能力可能有所帮助。 这是我到目前为止的骨架: DataTable Table = GetTonsOfData(); // Chunks should be any IEnumerable type var Chunks = ChunkifyTableIntoSmallerChunksSomehow; // ** help here! ** foreach(var Chunk in Chunks) { // Chunk should be any IEnumerable type ProcessChunk(Chunk); } 关于什么应该取代ChunkifyTableIntoSmallerChunksSomehow任何建议? 我真的很感兴趣的是如何通过访问C#3工具来实现这一目标。 如果试图应用这些工具是不合适的,请解释! 更新3(修改后的块,因为我真的想要表,而不是ienumerables;使用扩展方法 – 感谢雅各布): 最终实施: 处理分块的扩展方法: public static class HarenExtensions { public […]