【问题标题】:Need LINQ query to search a list of string in a list of input values需要 LINQ 查询来搜索输入值列表中的字符串列表
【发布时间】:2021-11-12 14:15:51
【问题描述】:

假设我必须搜索以codes 列表开头的inputValues 列表。我在foreach 循环的帮助下完成了它。但我需要使用 LINQ 做同样的事情:

List<string> inputValues = new List<string> {
    "S083*01999900FN0060000.000001097.00000.0020020101",
    "S013*01999900FN0060000.100001097.00000.0020020101",
    "S529*01999900FN0060000.999001097.00000.0020020101",
    "S530*01999900FN0060000.222001097.00000.0020020101",
    "S530*45199900FMo060000.222001097.00000.0020020101",
    "S541*01999900FN0060000.999001097.00000.0020020101",
    "S519*01999900FN0060000.999001097.00000.0020020101",
    "S099*01999900FN0060000.999001097.00000.0020020101",
};

List<string> codes = new List<string> { 
    "S099", "S529", "S530", "I897",
};

private static List<string> GetValidList(List<string> inputValues, 
                                         List<string> codes)
{
    List<string> result=new List<string>();
        
    foreach( string item in inputValues)
    {
        foreach(string code in codes)
        {
            if (item.StartsWith(code))
                result.Add(item);
        }
    }

    return result;
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    Linq 查询可以是这样的:

    var result = inputValues
      .Where(value => codes.Any(code => value.StartsWith(code)))
      .ToList(); 
    

    在这里,我们对来自inputValues 的每个value 检查是否有来自codescode,这样value 就从这个code 开始

    方法

    private static List<string> GetValidList(List<string> inputValues, 
                                             List<string> codes) => inputValues
      .Where(value => codes.Any(code => value.StartsWith(code)))
      .ToList(); 
    

    编辑:如果我们想在codes重复项时返回重复项(请参阅 Harald Coppoolse 的评论),我们可以输入SelectMany

    private static List<string> GetValidList(List<string> inputValues,
                                             List<string> codes) => codes
      .SelectMany(code => inputValues.Where(value => value.StartsWith(code)))
      .ToList();
    

    【讨论】:

    • 非常感谢您的回答,它确实有效。你能分享一些链接来学习一些技术来构建这种类型的 LINQ 吗?
    • @Srikant Mishra:我通过在 Stack Overflow 上回答并将我的答案与更好的答案进行比较来自学。与 SQL 不同,Linq 不是课程、新兵训练营的热门话题……
    • 您确实意识到此答案给出的结果与原始答案不同。例如如果List&lt;string&gt; codes = new List&lt;string&gt; { "S099", "S099"};,那么原始代码会给你两次输入值"S099*01999900FN0060000.999001097.00000.0020020101",而这个答案只会给它一次
    • @Harald Coppoolse:感谢您提供的有趣案例(即使我 怀疑 codes 是否会有重复)!如果我们想在codes 有重复的时候得到重复的结果,我们可以使用SelectMany。我已经编辑了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多