Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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# C如何用相同的正则表达式结果填充变量?_C# - Fatal编程技术网

C# C如何用相同的正则表达式结果填充变量?

C# C如何用相同的正则表达式结果填充变量?,c#,C#,我在从给定的数据集中选择一些数据时遇到了一些困难。假设我有一个没有指定类型的汽车列表。所以我需要通过名字和我能知道的类型来选择它们 var ItemList = Entries?.Where(entry => (entry?.Type?.IsCar() ?? false)) ?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"ferrari|lamborghini|mclaren")) //

我在从给定的数据集中选择一些数据时遇到了一些困难。假设我有一个没有指定类型的汽车列表。所以我需要通过名字和我能知道的类型来选择它们

var ItemList = Entries?.Where(entry => (entry?.Type?.IsCar() ?? false))
    ?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"ferrari|lamborghini|mclaren"))        //sports cars
    ?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"bmw|audi|mercedes"))                  // personal cars
    ?.OrderBy(entry => entry?.Name?.RegexMatchSuccessIgnoreCase(@"man|iveco"))                          //trucks
    ?.ThenBy(entry => entry?.Weight ?? int.MaxValue)
    ?.ToArray();
这将给我所有汽车的名单,并按名称和重量排序,这是一种确定的,但不完全

我正在寻找的是能够填写每种类型的项目列表,如果没有从该类型的汽车,填写另一种类型。所以首先,项目列表必须只包含跑车,如果没有,试着找出私家车,如果没有,试着找出卡车

例如:

var ItemList = Entries?.Select(entry =>
    entry?.Name?.RegexMatchSuccessIgnoreCase(@"ferrari|lamborghini|mclaren") ??       //sports cars
    entry?.Name?.RegexMatchSuccessIgnoreCase(@"bmw|audi|mercedes") ??        // personal cars
    entry?.Name?.RegexMatchSuccessIgnoreCase(@"man|iveco")                 //trucks
    ).DefaultIfEmpty(false);
但这给了我真/假,因为第一个返回我可以使用的条目

有人能踢我的大脑吗?如何按类型选择这些内容,并能将它们用作条目而不是布尔


谢谢

我将尝试回答您关于如何能够按每种类型填充ItemList的问题,如果没有来自该类型的汽车,请使用条件运算符用另一种类型填充它。由于您没有给出注释中指出的MCVE,我将使用一个简单的字符串列表作为示例,您应该能够通过简单的替换将其绘制到示例的上下文中,即,您可以检查每个正则表达式匹配项,而不是检查每个值

var entries = new List<string>(){"a", "a", "b"};

var itemList = entries.Any(e => e == "a") ? entries.Where(e => e == "a") 
                      : entries.Any(e => e == "b")  
                      ? entries.Where(e => e == "b") // continue for all your types
                      : null;

这个想法非常简单,检查列表是否包含与您的特定类型匹配的内容,如果是,返回该类型的所有元素,然后短路,否则检查下一个类型,依此类推。您可能可以更有效地执行此操作这只是为了为您的问题提供一个可能的解决方案

无关的注释:几天后,即使您也无法阅读该代码。我建议提高可读性,而不是在一条语句中完成所有工作,这将同时帮助您解决问题。您能否提供一个简单的示例,这样我们就不必自己编写类并填充数据。以上评论是正确的。您可以创建一个静态类来为您执行这些操作,例如bool EntryNameMatchesRegexregex或List selectentries with matchingresultsregex,并分别调用每一个。查找单一责任的一些原则不要使用正则表达式。值位于DataTable中,与使用正则表达式相比,对DataTable的行进行分组和排序要容易得多。您可能有也可能没有一个列表,其中的项可能为空,也可能不为空,也可能没有类型、名称或权重。您在不需要时使用正则表达式,在linq扩展方法的结果上检查null,但它们从来都不需要。。这真的是一个重新开始的例子,并且有可能成为一个更坚实的类和方法来容纳您的关注点