Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在其他集合和LINQ lambda表达式中循环通过集合_C#_Linq_Lambda - Fatal编程技术网

C# 在其他集合和LINQ lambda表达式中循环通过集合

C# 在其他集合和LINQ lambda表达式中循环通过集合,c#,linq,lambda,C#,Linq,Lambda,在这里,我从所有FactoryOption中选择标题为“TRANSMISSION”的描述 如果标题为空,我想在与“传输”匹配的不明确选项中搜索标题 如下所示: foreach (var fOptions in _vDetails.fOptions) { if (fOptions.header != null && fOptions.header.Value.ToUpper() == "TRANSMISSION") { tOptions = fOpt

在这里,我从所有FactoryOption中选择标题为“TRANSMISSION”的描述

如果标题为空,我想在与“传输”匹配的不明确选项中搜索标题

如下所示:

foreach (var fOptions in _vDetails.fOptions)
{
    if (fOptions.header != null && fOptions.header.Value.ToUpper() == "TRANSMISSION")
    {
        tOptions = fOptions.description;
    }
    else if (fOptions.ambiguousOption != null)
    {
        foreach (var ambiguousOption in fOptions.ambiguousOption)
        {
            if (ambiguousOption.header != null && ambiguousOption.header.Value.ToUpper() == "TRANSMISSION")
            {
                newseq = tOptions.Concat(ambiguousOption.description);
            }
        }
    }
}

我正在尝试更改现有的LINQ lambda表达式,以便在
选项中进行迭代。含糊不清的选项
请有人提出建议。

如果我理解正确,我认为您只想执行以下操作:

var result = options.SelectMany(o => IsTransmissionHeader(o.header) ? o.description :
                                         o.ambigousOptions == null || !o.ambigousOptions.Any(x => IsTransmissionHeader(x.header)) ? new string[] { } : 
                                         o.ambigousOptions.First(x => IsTransmissionHeader(x.header)).description)
                    .Where(d => d.Any());
var result = options.SelectMany(o => IsTransmissionHeader(o.header) ? o.description :
                                         o.ambigousOptions == null || !o.ambigousOptions.Any(x => IsTransmissionHeader(x.header)) ? new string[] { } :
                                         o.ambigousOptions.Where(x => IsTransmissionHeader(x.header)).SelectMany(x => x.description));
我添加了一个静态方法来检查标题:

public static bool IsTransmissionHeader(Header header)
{
    return header != null && header.Value != null && header.Value.ToUpper() == "TRANSMISSION"
}
这将返回
IEnumerable
。如果需要
IEnumerable
SelectMany
更改为
Select

编辑:

要从
ambigousOptions
获取所有变速器描述值,您需要更改最后一行,使其如下所示:

var result = options.SelectMany(o => IsTransmissionHeader(o.header) ? o.description :
                                         o.ambigousOptions == null || !o.ambigousOptions.Any(x => IsTransmissionHeader(x.header)) ? new string[] { } : 
                                         o.ambigousOptions.First(x => IsTransmissionHeader(x.header)).description)
                    .Where(d => d.Any());
var result = options.SelectMany(o => IsTransmissionHeader(o.header) ? o.description :
                                         o.ambigousOptions == null || !o.ambigousOptions.Any(x => IsTransmissionHeader(x.header)) ? new string[] { } :
                                         o.ambigousOptions.Where(x => IsTransmissionHeader(x.header)).SelectMany(x => x.description));

这应该是你想要的。这里,我将具有匹配标题的
FactoryOption
中的描述与具有匹配标题的
AmbiguousOption
中的描述连接起来

var descriptions = details.SelectMany(d => d.FactoryOptions.Where(f => f.Header == "TRANSMISSION").Select(f => f.Description)
    .Concat(d.FactoryOptions.SelectMany(f => f.AmbiguousOptions.Where(a => a.Header == "TRANSMISSION").Select(a => a.Description))));
更新 上面的答案适用于当您开始收集
详细信息时。如果从单个
细节开始,则可以执行以下操作:

_vehicleDetails.FactoryOptions.Where(f => f.Header == "TRANSMISSION").Select(f => f.Description)
    .Concat(_vehicleDetails.FactoryOptions.SelectMany(f => f.AmbiguousOptions.Where(a => a.Header == "TRANSMISSION").Select(a => a.Description)));

你能提供一些样本数据让我在上面测试我的linq表达式吗?我不明白你想做什么。。。是否要将Foreach语句更改为Linq语句?什么类型是
factoryOption.description
?字符串还是列表?如果它是一个列表,是什么类型的?上面的语句将返回一个描述列表。如果外部选项标题为TRANSMISSION,则采用描述,否则检查内部选项。您不了解哪一部分?Where子句只是在外部标题不是“TRANSMISSION”且内部选项都为null或其标题都不是“TRANSMISSION”的情况下过滤出现的任何空字符串。我再次更新了答案。您能告诉我这对您是否有效吗?我在
IsTransmissionHeader
方法中添加了另一个空检查。你能看到这是否修复了异常吗?我更新了答案,以显示如何获取所有
模糊选项。若答案解决了你们的问题,你们能记得接受它吗?我的答案对你们不起作用吗?如果没有,在什么情况下会失败?