【问题标题】:Add matching word into list with lambda expression使用 lambda 表达式将匹配的单词添加到列表中
【发布时间】:2017-07-20 11:27:35
【问题描述】:

如何将所有必需的单词添加到具有单行代码的列表中?我想使用 lambda 表达式,但不知道如何使用?也欢迎其他解决方案。以 NET 2.0 为目标时,可以使用 lambda,但不能使用 LINQ。那么是否可以避免添加LINQ dll?

List<string> lstStr = new List<string>();
string[] objStr = new string[] { "Software", "Development", "department", "store", "Marketing" };
foreach (string objLcl in objStr)
{
    if (objLcl.Contains("o"))
    {
        lstStr.Add(objLcl);
    }
}

【问题讨论】:

  • 您的示例将返回一个空集合。你是这个意思吗?还是你的意思是Contains("o")
  • 结果应该是什么样的?目前它返回一个空集合,但我想你想要所有包含字符o的单词,不是吗?
  • 你为什么这么在意一行?您应该首先确保代码按预期工作并且很好理解。然后看看一些 Linq 教程
  • 哦,其实我做了一些研发,忘记改代码了。
  • 如果您不能使用 LINQ,请不要将 LINQ 作为标记。似乎相当违反直觉。

标签: c# lambda .net-2.0


【解决方案1】:

你可以使用 LINQ Where() 这样的方法

lstStr  = objstr.Where(s => s.Contains("o")).ToList();

根据评论,如果您想进行不区分大小写的搜索,您将不得不使用indexOf() 方法,您可以在其中传递StringComparison 枚举值,因为Contains() 没有可以采用StringComparison 的重载枚举值。

lstStr  = objstr.Where(s => s.IndexOf("o", StringComparison.OrdinalIgnoreCase) >= 0)
                .ToList();

同样,如果您想使用 LINQ,请使用普通的 foreach 循环控制,例如

foreach(var s in objstr)
{
  if(s.IndexOf("o", StringComparison.OrdinalIgnoreCase) >= 0)
      lstStr.Add(s);  
}

【讨论】:

  • @un-lucky,这主要是拼写错误导致发布的数组值不会做任何事情
  • 大声笑现在添加了
  • @J.Steen,对,但它是每个 OP 发布的代码,其中数组值是小写的
  • 如果我不想使用 LINQ 那么?
  • 以 NET 2.0 为目标时,可以使用 lambda,但不能使用 LINQ。那么是否可以避免 LINQ dll add?
【解决方案2】:

现在,随着更多的研发,我找到了一个非常简单的解决方案。

lstStr.AddRange(Array.FindAll(objStr, x => x.Contains("o")));

【讨论】:

    【解决方案3】:

    如果要添加所有包含“o”的字符串:

    lstStr.AddRange(objStr.Where(o => o.Contains("o")));
    

    【讨论】:

    • 有时我会感觉到,我身后跟着一些寻求报复的人。来自 Rahul 的相同答案,后来得到了支持。真奇怪
    • @J.Steen 为什么会这样?即使是作为工作示例的代码 OP 也不会这样做?您是否想说 OP 认为他的代码有效的假设是错误的 ;-)^^
    • @J.Steen 好的,鉴于他的问题,你可能是对的:-D
    • 以 NET 2.0 为目标时,可以使用 lambda,但不能使用 LINQ。那么是否可以避免添加LINQ dll?
    【解决方案4】:

    这应该适合你。假设您想要包含“o”且不等于“o”的条目。如果不是,您必须将 Contains 更改为 Equals 并获得预期的结果。

    string[] objStr = new string[] { "Software", "Development", "department", "store", "Marketing" };
    var lstStr = objStr.Where(x => x.Contains("o")).ToList();
    

    查看101 LINQ-Samples 了解更多信息。

    【讨论】:

    • 以 NET 2.0 为目标时,可以使用 lambda,但不能使用 LINQ。那么是否可以避免添加LINQ dll?
    【解决方案5】:

    为避免额外的内存分配,可以从源集合中删除项目(无 LINQ):

    var lstStr = new List<string> { "Software", "Development", "department", "store", "Marketing" };
    
    lstStr.RemoveAll(s => !s.Contains("o"));
    

    【讨论】:

    • 但是您直接将值添加到列表中...?
    • @cSharma 或使用列表代替数组
    【解决方案6】:

    下面是 Linq

    string[] objStr = new string[] { "Software", "Development", "department", "store", "Marketing" };
    List<string> lstStr = objStr.Where(objLcl => objLcl.Contains("o")).ToList();
    

    【讨论】:

    • 我从数据库中获取数据,其中需要按某些特定单词对行进行分类并存储在不同的表中。所以我想用更少的编码来做到这一点。
    猜你喜欢
    • 2020-08-03
    • 2018-09-05
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多