标签: linq-to-objects

当条件为真时,LINQ to对象是否停止处理Any()?

考虑以下:

bool invalidChildren = this.Children.Any(c => !c.IsValid());
Run Code Online (Sandbox Code Playgroud)

此类具有一组具有IsValid()方法的子对象.假设该IsValid()方法是处理器密集型任务.遇到的第一个孩子对象,其中经过IsValid()false,理论上可以处理停止,因为结果可能永远不会成为现实.LINQ to对象实际上是在第一个之后停止评估IsValid() = false(如逻辑AND)还是继续评估所有子对象?

显然我可以把它放在foreach循环中并打破第一个无效结果,但我只是想知道对象的LINQ是否足够智能来做到这一点.

编辑: 谢谢你的答案,由于某种原因,我不认为自己在MSDN上查找它.

c# linq-to-objects

14
推荐指数
2
解决办法
2855
查看次数

如何创建动态LINQ连接扩展方法

Visual Studio 2008中,有一个动态LINQ扩展方法库作为示例发布.我想用join方法扩展它.下面的代码在运行时失败并带有参数未匹配异常.问题出在哪儿?

public static IQueryable Join(this IQueryable outer, IEnumerable inner,
                              string outerSelector, string innerSelector, string resultsSelector,
                              params object[] values)
{
    if (inner == null)
        throw new ArgumentNullException("inner");
    if (outerSelector == null)
        throw new ArgumentNullException("outerSelector");
    if (innerSelector == null)
        throw new ArgumentNullException("innerSelector");
    if (resultsSelector == null)
        throw new ArgumentNullException("resultsSelctor");

    LambdaExpression outerSelectorLambda =
        DynamicExpression.ParseLambda(outer.ElementType, null,
                                      outerSelector, values);
    LambdaExpression innerSelectorLambda =
        DynamicExpression.ParseLambda(inner.AsQueryable().ElementType,
                                      null, innerSelector, values);

    ParameterExpression[] parameters = new ParameterExpression[] {
        Expression.Parameter(outer.ElementType, "outer"),
        Expression.Parameter(inner.AsQueryable().ElementType,
        "inner")
    };
    LambdaExpression resultsSelectorLambda …
Run Code Online (Sandbox Code Playgroud)

linq linq-to-objects linq-to-entities linq-to-sql c#-3.0

13
推荐指数
1
解决办法
3万
查看次数

用LINQ替换嵌套的foreach; 在内部修改和更新属性

考虑在5或6级深度的对象的一个​​或多个属性上更改数据成员的要求.

有些子集需要迭代才能到达需要检查和修改的属性.

在这里,我们将调用一种方法来清除Employee的街道地址.由于我们在循环中更改数据,因此当前实现需要一个for循环来防止异常:

无法分配给"someVariable",因为它是'foreach迭代变量'

这是使用嵌套foreach和a 的当前算法(混淆)for.

foreach (var emp in company.internalData.Emps)
{
    foreach (var addr in emp.privateData.Addresses)
    {
        int numberAddresses = addr.Items.Length;

        for (int i = 0; i < numberAddresses; i++)
        {
            //transform this street address via a static method
            if (addr.Items[i].Type =="StreetAddress")
               addr.Items[i].Text = CleanStreetAddressLine(addr.Items[i].Text);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题: 可以使用LINQ重新实现此算法吗?要求原始集合通过静态方法调用更改其数据.

更新:我正在思考/倾向于jQuery/selector类型解决方案的方向.我没有以这种方式具体说出这个问题.我意识到我对这个想法的影响太大(没有副作用).谢谢大家!如果有这样的方法来执行类似jQuery的选择器,请让我们看看它!

c# linq algorithm linq-to-objects

13
推荐指数
4
解决办法
3万
查看次数

获取不同项目及其计数的列表

我有一个对象,它有许多属性但只有两个需要担心的是:

myobject.ID其是int
myobject.Names其是HashSet

然后我有List一些看起来像这样的对象:

List<myobject>
Run Code Online (Sandbox Code Playgroud)

我使用Linq将一些数据转换为转发器,但我不知道如何获取名称列表以及它们出现的频率.

想要使用Linq以避免必须遍历数据.

正如我的标签应该显示的那样,这是一个使用C#的ASP.NET解决方案.

一些澄清:
假设我的列表中只有三个项目:项目1中有John,Fred,Jack的名字.第2项有John,Fred,Joe的名字.第3项约翰的名字.

我试图返回以下内容:John - 3 Fred - 2 Jack - 1 Joe - 1

另外,作为一个注释,我熟悉必须为我的对象编写我自己的比较器,我只是错过了我的想法中整体解决方案的"如何".

c# linq asp.net linq-to-objects

13
推荐指数
2
解决办法
2万
查看次数

如何使用LINQ和C#使用List更新元素

我有一个对象列表,我想更新其中一个对象中的特定成员变量.我知道LINQ是专为查询而设计的,并不意味着更新不可变数据列表.实现这一目标的最佳方法是什么?如果效率不高,我不需要使用LINQ作为解决方案.

创建Update扩展方法是否有效?如果是这样,我该怎么做呢?

EXAMPLE:
(from trade in CrudeBalancedList
 where trade.Date.Month == monthIndex
 select trade).Update(
 trade => trade.Buy += optionQty);
Run Code Online (Sandbox Code Playgroud)

.net c# linq ienumerable linq-to-objects

13
推荐指数
1
解决办法
6万
查看次数

如何使用Joins PLINQ现有的LINQ查询?

我正在使用LINQ将两个DataSet相互比较以创建新行并更新现有行.我注意到完整的比较持续约1.5小时,并且两个核心中只有一个忙(任务管理器的CPU使用率为50-52%).我必须承认,我对并行LINQ完全不熟悉,但我认为它可以显着提高性能.

所以我的问题是,我应该如何以及应该并行化什么?

这些是原始查询(简化为要点):

'check for new data
Dim srcUnique = From row In src.Email_Total
                Select Ticket_ID = row.ticket_id, Interaction = row.interaction, ModifiedAt = row.modified_time

Dim destUnique = From row In dest.ContactDetail
                 Where row.ContactRow.fiContactType = emailContactType.idContactType
                 Select row.ContactRow.Ticket_ID, row.Interaction, row.ModifiedAt

'get all emails(contactdetails) that are in source but not in destination
Dim diffRows = srcUnique.Except(destUnique).ToList

'get all new emails(according to ticket_id) for calculating contact columns
Dim newRowsTickets = (From row In src.Email_Total
                     Join d In diffRows
                     On row.ticket_id Equals d.Ticket_ID _ …
Run Code Online (Sandbox Code Playgroud)

.net linq vb.net linq-to-objects parallel-extensions

13
推荐指数
1
解决办法
2485
查看次数

Linq Lambda与查询语法性能

我今天在我的项目中看到了一个linq查询语法,它以List这种方式从特定条件的项目开始计算:

int temp =  (from A in pTasks 
             where A.StatusID == (int)BusinessRule.TaskStatus.Pending     
             select A).ToList().Count();
Run Code Online (Sandbox Code Playgroud)

我想通过写它来重构它,就像使用Count()更易读,我认为它会表现得更好,所以我写道:

int UnassignedCount = pTasks.Count(x => x.StatusID == (int)BusinessRule.TaskStatus.Pending);
Run Code Online (Sandbox Code Playgroud)

但是,当我通过将StopWatchlambda表达式使用的时间进行检查时,总是比查询synax更多:

Stopwatch s = new Stopwatch();
s.Start();
int UnassignedCount = pTasks.Count(x => x.StatusID == (int)BusinessRule.TaskStatus.Pending);
s.Stop();
Stopwatch s2 = new Stopwatch();
s2.Start();
int temp =  (from A in pTasks 
             where A.StatusID == (int)BusinessRule.TaskStatus.Pending
             select A).ToList().Count();
s2.Stop();
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样吗?

c# linq performance lambda linq-to-objects

13
推荐指数
2
解决办法
5647
查看次数

LINQ中的OrderBy和Top具有良好的性能

从大型集合中获取前10条记录并使用自定义OrderBy的好方法是什么?如果我使用LINQ to Objects OrderBy方法,它会很慢并占用大量内存,因为它会使用新订单创建一个完整的新集合.我想要一个带有下面签名的新方法,它不会重新整理整个集合并且非常快:

public static IEnumerable<TSource> OrderByTop<TSource, TKey>(
    IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer,
    int topCount)
Run Code Online (Sandbox Code Playgroud)

我试着写它但它变得非常复杂,我想可能有更简单的方法使用Aggregate或其他东西.任何帮助,将不胜感激.

回答

谢谢您的帮助.我最终得到了以下代码:

public static List<TSource> OrderByTop<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer,
    int topCount)
{
    var itemComparer = keySelector.ToIComparer(comparer);
    return source.Aggregate(
        new List<TSource>(topCount),
        (List<TSource> list, TSource item) =>
            list.SortedInsert(item, itemComparer, topCount));
}
Run Code Online (Sandbox Code Playgroud)

List Extension方法SortedInsert如下:

public static List<T> SortedInsert<T>(
    this List<T> list,
    T item,
    IComparer<T> comparer,
    int maxLength)
{
    if (list.Count == maxLength)
        if (comparer.Compare(item, list[maxLength - 1]) >= …
Run Code Online (Sandbox Code Playgroud)

c# linq performance linq-to-objects sql-order-by

12
推荐指数
1
解决办法
5489
查看次数

在FirstOrDefault之后,对象是否仍然连接到列表?

这是我的代码:

        Event thisEvent = (from i in list
                           where (i.eventID == eventID)
                           select i).FirstOrDefault();
        if (thisEvent != null)
        {
            thisEvent.eventResolved = resolved;
            thisEvent.eventSequence.Add(item);
        }
Run Code Online (Sandbox Code Playgroud)

"list"是IEnumerable的集合,即

IEnumerable<Event> list;
Run Code Online (Sandbox Code Playgroud)

我想知道的是:在使用FirstOrDefault创建thisEvent之后,thisEvent是否仍然连接到列表?换句话说,当我更改两个属性,eventResolved和eventSequence时,实际更改了"list",或者thisEvent只是"list"中项目的一些完全断开的副本?

linq ienumerable linq-to-objects

12
推荐指数
1
解决办法
3192
查看次数

C#System.Linq.Lookup类删除和添加值

我在C#中使用Lookup类作为我的主要数据容器,供用户从两个Checked List框中选择值.

Lookup类比使用类Dictionary更容易使用,但是我找不到用于删除和向查找类添加值的方法.

我想过使用where和union,但我似乎无法正确使用它.

提前致谢.

linq lookup linq-to-objects c#-3.0

12
推荐指数
1
解决办法
2万
查看次数