【问题标题】:substring with linq?带有linq的子字符串?
【发布时间】:2010-03-08 15:48:08
【问题描述】:

我有单词集合,我想从这个集合中创建集合,限制为 5 个字符

输入:

Car
Collection
Limited
stackoverflow

输出:

car
colle
limit
stack

word.Substring(0,5) 抛出异常(长度)

word.Take(10) 也不是个好主意...

有什么好主意吗??

【问题讨论】:

  • 你得到了例外,因为汽车只有 3 个字符长,你要求一个 5 个字符的子字符串。
  • 是的,我知道。情况要复杂得多,而我已经向您描述的这个复杂情况有一个最大的问题:)
  • 与 LINQ 一样酷(我真的认为它很酷),如何使用它来实现比“老式”foreach 循环更好/更具可读性?

标签: c# linq string


【解决方案1】:

此方案的 LINQ to 对象?您可以像这样进行选择:

from w in words
select new
{
  Word = (w.Length > 5) ? w.Substring(0, 5) : w
};

从本质上讲,?:帮助您解决这个问题。

【讨论】:

  • 您应该为null 元素添加检查。即var subwords = words.Where(w => w != null).Select(w => w.Length > 5 ? w.Substring(0, 5) : w);
【解决方案2】:
var words = new [] { "Car", "Collection", "Limited", "stackoverflow" };
IEnumerable<string> cropped = words.Select(word => 
                                    word[0..Math.Min(5, word.Length)]);

范围在 C# 8 中可用,否则您需要这样做:

IEnumerable<string> cropped = words.Select(word => 
                                    word.Substring(0, Math.Min(5, word.Length)));

【讨论】:

    【解决方案3】:

    你能做的就是

    string partialText = text.Substring(0, Math.Min(text.Length, 5));
    

    【讨论】:

      【解决方案4】:

      我相信您正在寻找的答案是这样的:

      var x = new string[] {"car", "Collection", "Limited", "stackoverflow" };
      var output = x.Select(word => String.Join("", word.Take(5).ToList()));
      

      变量“输出”包含结果:

      car 
      Colle 
      Limit
      stack 
      

      并且字符串“car”不会引发异常。

      但是,虽然 Join and Take(5) 有效,但通常使用起来要简单得多,正如另一个答案中所建议的那样,

      subString = word.Substring(0,Math.Min(5,word.Length));
      

      后一个代码更易于阅读且更轻量级,尽管在字符串上使用 Linq 来获取前五个字符肯定有点酷,而无需检查字符串的长度。

      【讨论】:

        猜你喜欢
        • 2015-04-24
        • 1970-01-01
        • 2020-05-21
        • 2020-11-20
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多