Tag: ienumerable

何时使用IEnumerable vs IObservable?

如何确定方法是否应该返回IEnumerable或IObservable ? 为什么我会选择一种范式而不是另一种?

缓存IEnumerable

public IEnumerable ListModules() { foreach (XElement m in Source.Descendants(“Module”)) { yield return new ModuleData(m.Element(“ModuleID”).Value); } } 最初上面的代码很棒,因为如果不需要,就不需要评估整个集合。 但是,一旦枚举了所有模块,在没有更改时重复查询XDocument会变得更加昂贵。 所以,作为绩效改进: public IEnumerable ListModules() { if (Modules == null) { Modules = new List(); foreach (XElement m in Source.Descendants(“Module”)) { Modules.Add(new ModuleData(m.Element(“ModuleID”).Value, 1, 1)); } } return Modules; } 如果我反复使用整个列表,那就太好了,但不是那么好。 是否存在中间点,我可以在整个列表被迭代之前返回,然后缓存它并将缓存提供给后续请求?

Array.Count()比List.Count()慢得多

使用IEnumerable Count()的扩展方法时,数组至少比列表慢两倍。 Function Count() List 2,299 int[] 6,903 差异来自哪里? 我知道两者都在调用ICollection的Count属性: 如果源的类型实现ICollection,则该实现用于获取元素的数量。 否则,此方法确定计数。 对于列表,它返回List.Count ,对于array, Array.Length 。 而且, Array.Length应该比List.Count 。 基准测试: class Program { public const long Iterations = (long)1e8; static void Main() { var list = new List(){1}; var array = new int[1]; array[0] = 1; var results = new Dictionary(); results.Add(“List”, Benchmark(list, Iterations)); results.Add(“int[]”, […]

为什么我们不能为以下代码调试带有yield return的方法?

以下是我的代码: class Program { static List MyList; static void Main(string[] args) { MyList = new List() { 1,24,56,7}; var sn = FilterWithYield(); } static IEnumerable FilterWithYield() { foreach (int i in MyList) { if (i > 3) yield return i; } } } 我在FilterWithYield方法中有一个断点,但它根本没有达到断点。 我在调用点有一个中断,即var sn = FilterWithYield(); 控制命中此点并在调试窗口中正确显示结果。 但是为什么控制不在FilterWithYield方法中停止? 还有一个问题。 我读到yield将数据返回给调用者。如果将FilterWithYield方法的返回类型更改为int则通过error实现。如果yield关键字总是需要IEnumerable作为返回类型?

如何向SqlParameter Collection添加新参数?

我想使用类似这样的东西: using (DataSet ds = new DataSet()) { SqlParameter[] dbParams = new SqlParameter[] { new SqlParameter(“@PromptID”, promptID) }; if (scenarioID != 0) dbParams.Concat(new SqlParameter(“@ScenarioID”, scenarioID)); //OR if (scenarioID != 0) dbParams.Add(new SqlParameter(“@ScenarioID”, scenarioID)); } } 我已经搜索过添加IEnumarable集合,但它并没有解决我的问题。 我应该创建两个集合并连接它们吗? 我认为必须有一种简单的方法来添加项目。 有什么建议?

在树结构上实现IEnumerable

根据这些家伙的工作: http://dvanderboom.wordpress.com/2008/03/15/treet-implementing-a-non-binary-tree-in-c/ http://www.matthidinger.com/archive/2009/02/08/asp.net-mvc-recursive-treeview-helper.aspx 我正在尝试实现一个可以这样使用的TreeView助手: r.Children, r => r.ID) %> 树结构的定义如下: public class Tree : TreeNode where T : TreeNode { } public class TreeNode : IDisposable where T : TreeNode { public T Parent { get; set; } public TreeNodeList Children { get; set; } } public class TreeNodeList : List<TreeNode> where T : TreeNode […]

无法将类型System.Collections.Generic.IEnumerable 转换为System.Collections.Generic.List

使用下面的代码我得到这个错误,并需要帮助如何让方法Load返回List 无法将System.Collections.Generic.IEnumerable类型转换为System.Collections.Generic.List public class A { public List Load(Collection coll) { List list = from x in coll select new B {Prop1 = x.title, Prop2 = x.dept}; return list; } } public class B { public string Prop1 {get;set;} public string Prop2 {get;set;} }

枚举器行为会根据我们的引用方式而改变吗?

在类中包含对列表枚举器的引用似乎改变了它的行为。 匿名类的示例: public static void Main() { var list = new List() { 1, 2, 3 }; var an = new { E = list.GetEnumerator() }; while (an.E.MoveNext()) { Debug.Write(an.E.Current); } } 我希望这打印“123”,但它只打印零,永远不会终止。 具体类的相同示例: public static void Main() { var list = new List() { 1, 2, 3 }; var an = new Foo() { […]

可以给出意想不到的输出

class Foo { public static IEnumerable Range(int start, int end) { return Enumerable.Range(start, end); } public static void PrintRange(IEnumerable r) { foreach (var item in r) { Console.Write(” {0} “, item); } Console.WriteLine(); } } class Program { static void TestFoo() { Foo.PrintRange(Foo.Range(10, 20)); } static void Main() { TestFoo(); } } 预期产出: 10 11 […]

使用yield return处理Enumerable对象的正确模式是什么?

是否存在返回Enumerable中所有项的yield的标准模式? 我经常发现我的一些代码反映了以下模式: public IEnumerable YieldReturningFunction() { … [logic and various standard yield return] … foreach(object obj in methodReturningEnumerable(x,y,z)) { yield return obj; } } foreach循环的显式用法仅仅是为了向我返回可枚举的代码味​​道的结果。 显然,我可以通过显式构建一个Enumerable并将每个标准yield返回的结果添加到它以及添加methodReturningEnumerable的结果范围来放弃使用yield return来增加我的代码的复杂性。 这将是不幸的,因此我希望有一种更好的方法来管理收益率回报模式。