Tag: enumerable

动态LINQ,选择函数,适用于Enumerable,但不适用于Queryable

我一直在摆弄动态LINQ一段时间了,但我还没有了解它的秘密。 我有一个我要解析的表达式,如下所示: “document.LineItems.Select(i => i.Credit).Sum();” 在解析这个问题时,我需要在LineItems Collection上调用Select函数。 我正在使用Expression.Call的工厂方法: Expression.Call( typeof(Queryable), “Select”, new Type[] { typeof(LineItem), typeof(decimal?) }, expr, Expression.Lambda(expression, new ParameterExpression[] { Expression.Parameter(typeof(LineItem) })); 此刻 expr: document.LineItems [ICollection] expression: LineItem.Credit [decimal?] 这些都没有实现。 我现在正在构建表达式树。 现在,问题是: 这个Expresssion.Call抛出和exception:“没有generics方法’选择’类型’System.Linq.Queryable’与提供的类型参数和参数兼容”; 我通过改变Expression.Call的第一个参数,通过在’System.Linq.Enumerable’而不是’Queryable’中查找’Select’来轻松解决它。 但是,这并不是我想要的。 我不希望所有LineItem都只计算Sum(),这显然是Enumerable的情况。 我想要Queryable工作。 另外,对于解析的最后一部分 – Sum(),我还需要使用Enumerable Sum(),因为Queryable Sum()会抛出相同的Exception。 我已经检查了MSDN,“选择”function的两个签名是相同的,所以我真的不明白为什么一个工作而另一个不工作。 任何帮助或指针都会受到重视。 问候,

请解释System.Linq.Enumerable.Where(Func predicate)

我无法理解MSDN文档对于接受谓词的Where方法的重载,该谓词有两个参数,其中int,据说代表源元素的索引,无论这意味着什么(我认为一个可枚举的是一个顺序,你看不到下一个项目,更不用说它的任何索引)。 有人可以解释如何使用这个重载,特别是Func中的int是什么以及如何使用它?

IEnumerable.Cast()vs IEnumerable.Select()中的强制转换

假设我有一个IEnumerable ,我希望将它们转换为与ASCII等效的字符。 对于一个整数,它只是(char)i ,所以总是有collection.Select(i => (char)i) ,但我认为使用collection.Cast()会有点干净。 当我使用collection.Cast()而不是collection.Select(i => (char)i)时,有人可以解释为什么我得到InvalidCastException吗? 编辑:有趣的是,当我调用collection.OfType()我得到一个空集。

在List – C#中选择整周没有rest日的记录

我有一个Employee类,定义如下: Employee { public int Id { get; set; } public string Name { get; set; } public DateTime WorkDate { get; set; } public bool isOff { get; set; } } 这是我的类实现和用法: List workers = new List() { new Employee { Id = 1, Name = “Emp 1”, WorkDate = Convert.ToDateTime(“4/11/2016”), IsOff = false}, […]

如何使DataTable可枚举?

我不能在DataTable上使用AsEnumerable(),我使用的是C#3,但我只是针对2.0框架(LINQfunction是由LINQBridge提供的)。 有没有什么办法可以在不使用Select()的情况下使DataTable可枚举? bool isExisting = (bdsAttachments.DataSource as DataTable).Select().Any(xxx => (string)dr[“filename”] == filename); 更新: 我希望它看起来像这样: bool isExisting = (bdsAttachments.DataSource as DataTable).AsEnumerable().Any(xxx => (string)dr[“filename”] == filename); 我得知,DataTable的Select方法返回一个副本,我想只使用AsEnumerable,问题是我只是针对2.0框架,System.Data.DataSetExtensions不可用 顺便说一下,我试过这个: http : //cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx ,但有编译错误。

如何在C#中使用Enumerable获取备用元素

这是我的问题的延续: 如何在C#中使用Enumarable来反转一系列元素? 现在我只需要替代元素。 这是我使用for循环的解决方案: int Max = 10; int limit = 5; Dictionary MyDict = new Dictionary(); int j = 0; for (int i = 0; i = limit) MyDict.Add((i+1).ToString(), “None”); else MyDict.Add((i+1).ToString(), j.ToString()); j+=2; } 输出就像 { “1” “0”} { “2” “2”} { “3” “4”} { “4” “6”} { “5” “8”} { “6” “None”} […]

为什么Enumerable.Range比直接yield循环更快?

下面的代码是检查执行相同解决方案的三种不同方式的性能。 public static void Main(string[] args) { // for loop { Stopwatch sw = Stopwatch.StartNew(); int accumulator = 0; for (int i = 1; i accumulator + n); sw.Stop(); Console.WriteLine(“time = {0}; result = {1}”, sw.ElapsedMilliseconds, ret); } //self-made IEnumerable { Stopwatch sw = Stopwatch.StartNew(); var ret = GetIntRange(1, 100000000).Aggregate(0, (accumulator, n) => accumulator + […]

使用LINQ和C#的随机数组

我正在阅读MSDN杂志上关于在LINQ中使用Enumerable类生成随机数组的文章。 本文使用VB.NET,我不能立即确定C#中的等价物是什么: Dim rnd As New System.Random() Dim numbers = Enumerable.Range(1, 100). _ OrderBy(Function() rnd.Next)