- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经尝试了很长时间来寻找一种“干净”的模式来处理具有匿名类型的 .SelectMany
,当您并不总是希望返回结果时。我最常见的用例如下所示:
.SelectMany
例如,逻辑可能看起来像这样:
//c is a customer
var context = GetContextForCustomer(c);
// look up some data, myData using the context connection
if (someCondition)
return myData.Select(x => new { CustomerID = c, X1 = x.x1, X2 = x.x2 });
else
return null;
这可以作为一个 foreach 语句来实现:
var results = new List<WhatType?>();
foreach (var c in customers) {
var context = GetContextForCustomer(c);
if (someCondition)
results.AddRange(myData.Select(x => new { CustomerID = c, X1 = x.x1, X2 = x.x2 }));
}
或者它可以用 .SelectMany
实现,它用 .Where
预先过滤:
customers
.Where(c => someCondition)
.AsParallel()
.SelectMany(c => {
var context = GetContextForCustomer(c);
return myData.Select(x => new { CustomerID = c, X1 = x.x1, X2 = x.x2 });
})
.ToList();
这两种方法都存在问题。 foreach
解决方案需要初始化一个List
来存储结果,并且您必须定义类型。 .SelectMany
和 .Where
通常是不切实际的,因为 someCondition
的逻辑相当复杂并且依赖于一些数据查找。所以我理想的解决方案看起来像这样:
customers
.AsParallel()
.SelectMany(c => {
var context = GetContextForCustomer(c);
if (someCondition)
return myData.Select(x => new { CustomerID = c, X1 = x.x1, X2 = x.x2 });
else
continue? return null? return empty list?
})
.ToList();
我应该在 else
行中输入什么来跳过返回值?我无法提出或理想的解决方案:
continue
无法编译,因为它不是事件的 foreach
循环return null
导致 NRE
返回
空列表需要我重新初始化一个匿名类型的列表。有没有一种方法可以做到上述的干净、简单、整洁,并且满足我所有(挑剔)的要求?
最佳答案
你可以返回一个空的 Enumerable<dynamic>
.这是一个示例(尽管没有您的客户和 someCondition
,因为我不知道它们是什么,但与您的示例具有相同的一般形式):
new int[] { 1, 2, 3, 4 }
.AsParallel()
.SelectMany(i => {
if (i % 2 == 0)
return Enumerable.Repeat(new { i, squared = i * i }, i);
else
return Enumerable.Empty<dynamic>();
})
.ToList();
因此,使用您的对象和 someCondition
, 它看起来像
customers
.AsParallel()
.SelectMany(c => {
var context = GetContextForCustomer(c);
if (someCondition)
return myData.Select(x => new { CustomerID = c, X1 = x.x1, X2 = x.x2 });
else
return Enumerable.Empty<dynamic>();
})
.ToList();
关于c# - SelectMany 匿名类型并跳过迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20158953/
这个问题已经有答案了: Difference Between Select and SelectMany (21 个回答) 已关闭 5 年前。 我遇到了 SelectMany 表达式的问题,我无法理解
此查询返回员工 ID、姓名、公司 ID、公司名称和公司城市。我缺少员工电子邮件地址(emailAddress 存储在 EmployeeEmailAddress 表中)和员工电话号码(phoneNumb
文章中Deep Dive into Rx SelectMany作者在最后的注释中提到了以下内容; Note: To mitigate the ordering issue, SelectMany()
我正在解析 XML 结构,我的类如下所示: class MyXml { //... List Content { get; set; } //... } class Node
我在用户组中有动态字段,我想根据用户组中的用户来选择它们。 基本上我想模拟像 .Where(x => x.UserGroupId == x || ... 这样的查询,否则它会进行大约 20 个查询来获
您好,我正在通过 MS 101 linq 示例编写代码。 “JoinOperators”给我带来了困难,因为我试图将查询表达式重构为 lambda 语法,反之亦然。 无论如何,在例子105我看到这个查
如果没有输入和输出,很难解释这一点。我制作了一个简单的汽车示例,以避免我的项目出现不必要的细节。 我有这个列表: List cars = new List() { new car() { ca
所以我有这些部分类。有关 ParseFCIE 的部分实现和我的问题,请参见下文。 class CiscoSwitch { Dictionary VSANList = new Dictionar
众所周知,Enumerable.SelectMany将一系列序列展平为单个序列。如果我们想要一种可以压平序列序列序列的序列的方法,等等递归怎么办? 我很快想出了一个使用 ICollection 的实现
这个问题在这里已经有了答案: SelectMany() Cannot Infer Type Argument -- Why Not? (1 个回答) 关闭 7 年前。 当我尝试编译我的代码时出现以下
我正在使用 NUnit、Moq 和 StructureMap。 我有以下 NUnit 测试: [Test] public void ShouldCallCustomMethod_For
我已经尝试了很长时间来寻找一种“干净”的模式来处理具有匿名类型的 .SelectMany,当您并不总是希望返回结果时。我最常见的用例如下所示: 我们有一份客户名单,我想对其进行报告。 每个客户的数据都
假设我有以下通用组合生成器静态方法: public static IEnumerable> GetAllPossibleCombos( IEnumerable> items) { IE
我可以使用 SelectMany 展平集合中子集合的结果: // a list of Foos, a Foo contains a List of Bars var source = new Li
基本上,我想做的是左外连接两个表并将它们呈现在一个平面结果中。为简单起见,我的两个表如下所示: tot["nameA", "nameB", "nameC"] critItg["nameA", "nam
如何以另一个 .SelectMany() 形式编写此 LINQ 表达式? var result = from a in numbersA
我目前正在查询如下字典, foreach (var instance in Dict) { X += $"(Description = '{instance.Key}') OR "; } 我可以
仅使用扩展方法应用 SelectMany 获得三个或更多序列的交叉连接的最佳方法是什么?有没有其他方法可以实现交叉连接? 测试数据 var a = Enumerable.Range(11, 2); v
我正在使用 Nancy 和 RavenDB 构建一个照片库我的模型类如下: [JsonObject(IsReference=true)] public class Album { public
我想知道如何使用SelectMany()。这似乎需要很多争论,从我自己的研究中我注意到 SelectMany() 可能是所有其他选择操作的“父亲”。 最佳答案 选择多个允许您从查询源中选择一个 IEn
我是一名优秀的程序员,十分优秀!