Tag: linq to objects

LINQ Except()方法不起作用

我有2个IList相同类型的对象ItemsDTO 。 我想从另一个列表中排除一个列表。 然而,这对我来说似乎没有用,我想知道为什么? IList related = itemsbl.GetRelatedItems(); IList relating = itemsbl.GetRelatingItems().Except(related).ToList(); 我正在尝试从relating列表中删除related项目。

如何将LINQ分区为对象查询?

这是资源分配问题。 我的目标是运行查询以获取任何时隙的最高优先级class次。 数据集非常大。 对于这个例子,假设1000家公司各有100个class次(尽管真实数据集更大)。 它们都被加载到内存中,我需要对它们运行一个LINQ to Objects查询: var topShifts = (from s in shifts where (from s2 in shifts where s2.CompanyId == s.CompanyId && s.TimeSlot == s2.TimeSlot orderby s2.Priority select s2).First().Equals(s) select s).ToList(); 问题在于,如果没有优化,LINQ to Objects将比较两个集合中的每个对象,进行所有1,000 x 100与1,000 x 100的交叉连接,这相当于100亿(10,000,000,000)个比较。 我想要的是只比较每个公司内的对象(就像公司在SQL表中被索引一样)。 这将产生1000组100×100个对象,总计1000万(10,000,000)个比较。 随着公司数量的增长,后者将线性扩展而不是指数级扩展。 像I4o这样的技术可以让我做这样的事情,但不幸的是,我没有在我正在执行这个查询的环境中使用自定义集合的奢侈。 此外,我只希望在任何给定的数据集上运行此查询一次,因此持久索引的值是有限的。 我希望使用一种扩展方法,它可以按公司对数据进行分组,然后在每个组上运行表达式。 完整示例代码: public struct Shift { public static long Iterations; […]

使用LINQ和LINQ扩展计算Dictionary中的值

我有一个字典看起来像这样: Dictionary<String, List> test1 : 1,3,4,5 test2 : 2,3,6,7 test3 : 2,8 如何使用LINQ和LINQ扩展计算所有值?

.GroupBy()是否保证其分组中的顺序?

假设我有一个(有序的)动物序列: 鹰 象 狼蛛 龟 虎 我按第一封信分组: Animals.GroupBy(animal => animal.First()) 结果序列中的IGrouping元素是否与输入序列的顺序相同?

TakeWhile,但也得到了阻止它的元素

我想在LINQ to Objects上使用LINQ TakeWhile函数。 但是,我还需要知道“破坏”函数的第一个元素,即条件不正确的第一个元素。 是否有一个函数可以获取所有不匹配的对象,加上第一个对象是什么? 例如,给定集合{1, 2, 3, 4, 5, 6, 7, 8} , mySet.MagicTakeWhile(x => x != 5); => {1, 2, 3, 4, 5}

如何`.Take()`对一个字符串并在结尾处获取一个字符串?

LINQ to Objects支持对字符串对象的查询,但是当我使用如下代码时: string SomeText = “this is some text in a string”; return SomeText.Take(6).ToString(); 我得到的只是: System.Linq.Enumerable+d__3a`1[System.Char] 在这个问题中 ,这被视为“意外”,但这是我实际上要做的事情,我无法通过任何地方的搜索找到它。 我知道还有其他方法可以操作字符串,但后来我也知道你可以用LINQ做一些非常酷的技巧,我想知道是否有办法用LINQ修剪字符串到一定的长度?

可以使用Linq在Sql和DataTable之间编写连接吗?

我有一个过程,根据时间戳从多个数据库(MySql)中提取客户信息。 我将这些数据存储到DataTable 。 数据表表示现有客户信息的更新以及新客户信息。 我想基于一个常量值, CompanyID和CustomerID删除目标数据库(SqlServer)中的任何欺骗。 所以,我认为连接会给我目标数据库中的dupes的RecordID,将List (或某些集合机制)传递给DELETE方法。 是)我有的: using (var context = new DataContext(SqlConnection)) { var tblSource = context.GetTable(); var dupeIDs = from currCust in tblSource join newCust in myTable.AsEnumerable() on currCust.CompanyID equals newCust.Field(“CompanyID”) where currCust.CustomerID.Equals(newCust.Field(“CustomerID”) select currCust.RecordID; } 这显然不起作用。 我将稍微更新确切的错误消息,但这不会编译。 首先,我的连接语法是否正确我想要实现的目标? 其次,如何编写这个Linq来连接DataTable和目标SqlServer数据库? 事后想想 – 一旦我有一个dupe RecordID集合,是否有可能使用Linq来删除目标数据库中的记录? 编辑为了澄清这个过程,我有像这样的传入数据表并包含在DataSet : Table1 CompanyID CustomerID Field1 Field2 […]

如何让LINQ返回集合中具有最大值的对象的索引?

我有一个不可变对象列表(在我的特定情况下是一个Tuple列表Tuple ),我想更改具有最高Item2值的那个。 理想情况下,我可以使用一个IndexOfMaxBy函数,所以我可以这样做: var indexOfPointWithHighestItem2 = myList.IndexOfMaxBy(x => x.Item2); var original = myList[indexOfPointWithHighestItem2]; myList[indexOfPointWithHighestItem2] = new Tuple(original.Item1, original.Item2 – 1); 我已经看到如何让LINQ返回具有给定属性的最大值的对象? ,并使用Jon Skeet的MaxByfunction与Select我可以做到: var indexOfPointWithHighestItem2 = myList.Select((x, i) => new { Index = i, Value = x }) .MaxBy(x => x.Item2).Index; 但是这会为我列表中的每个对象创建一个新对象,并且必须有一个更简洁的方法。 有没有人有任何好的建议?

组内的LINQ到对象索引+用于不同的分组(也称为ROW_NUMBER与PARTITION BY等效)

经过大量的Google搜索和代码实验,我对一个复杂的C#LINQ-to-objects问题感到难过,在SQL中使用一对ROW_NUMBER()… PARTITION BY函数和一个或两个子查询很容易解决这个问题。 用语言来说,这就是我在代码中尝试做的事情 – 基本要求是从列表中删除重复的文档: 首先,按(Document.Title,Document.SourceId)对列表进行分组,假设(简化)类定义如下: class Document { 字符串标题; int SourceId; //来源优先(ID = 1比ID = 2好) } 在该组中,为每个文档分配一个索引(例如,索引0 = =第一个文档,此标题来自此来源,索引1 =第二个文档,此标题来自此来源,等等)。 我喜欢SQL中相当于ROW_NUMBER()的东西! 现在分组(Document.Title,Index),其中Index在步骤#2中计算。 对于每个组,只返回一个文档:Document.SourceId最低的文档。 步骤#1很简单(例如codepronet.blogspot.com/2009/01/group-by-in-linq.html),但我对步骤#2和#3感到困惑。 我似乎无法构建一个红色无波形的C#LINQ查询来解决所有这三个步骤。 Anders Heilsberg关于这个post的post是我认为如果我能正确理解语法,那么上面的步骤#2和#3的答案。 我倾向于避免使用外部局部变量来执行索引计算,正如slodge.blogspot.com/2009/01/adding-row-number-using-linq-to-objects.html所建议的那样,因为该解决方案中断了如果外部变量被修改。 最佳地,可以首先完成逐个标题步骤,因此“内部”分组(首先由Source计算索引,然后通过索引来过滤掉重复项)可以对每个“按标题”中的少量对象进行操作group,因为每个by-title组中的文档数量通常都在100以下。我真的不想要N 2解决方案! 我当然可以用嵌套的foreach循环解决这个问题,但看起来像LINQ这个问题应该很简单。 有任何想法吗?

使用LINQ解析字符串中的数字

是否有可能编写一个查询,我们从任何给定的字符串中获取所有可以解析为int的字符? 例如,我们有一个字符串,如: “$%^DDFG 6 7 23 1″ 结果必须是”67231” 甚至更轻微一点:我们只能获得前三个数字吗?