考虑以下:
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上查找它.
在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) 考虑在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的选择器,请让我们看看它!
我有一个对象,它有许多属性但只有两个需要担心的是:
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
另外,作为一个注释,我熟悉必须为我的对象编写我自己的比较器,我只是错过了我的想法中整体解决方案的"如何".
我有一个对象列表,我想更新其中一个对象中的特定成员变量.我知道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) 我正在使用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) 我今天在我的项目中看到了一个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)
有人可以解释为什么会这样吗?
从大型集合中获取前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) 这是我的代码:
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"中项目的一些完全断开的副本?
我在C#中使用Lookup类作为我的主要数据容器,供用户从两个Checked List框中选择值.
Lookup类比使用类Dictionary更容易使用,但是我找不到用于删除和向查找类添加值的方法.
我想过使用where和union,但我似乎无法正确使用它.
提前致谢.
linq-to-objects ×10
linq ×9
c# ×6
.net ×2
c#-3.0 ×2
ienumerable ×2
performance ×2
algorithm ×1
asp.net ×1
lambda ×1
linq-to-sql ×1
lookup ×1
sql-order-by ×1
vb.net ×1