【问题标题】:how to `.Take()` on a string and get a string at the end?如何在字符串上`.Take()` 并在最后得到一个字符串?
【发布时间】:2011-08-30 08:00:12
【问题描述】:

LINQ to Objects 支持对字符串对象的查询,但是当我使用如下代码时:

string SomeText = "this is some text in a string";
return SomeText.Take(6).ToString();

我得到的是:

System.Linq.Enumerable+<TakeIterator>d__3a`1[System.Char]

这在this question 中被称为“意外”,但这是我真正想要做的,我无法通过任何地方的搜索找到它。

我知道还有其他方法可以操作字符串,但我也知道您可以使用 LINQ 做一些非常酷的技巧,我只是想知道是否有一种方法可以使用 LINQ 将字符串修剪到一定长度?

【问题讨论】:

    标签: c# linq string linq-to-objects take


    【解决方案1】:

    System.Linq 没有内置方法来执行此操作,但您可以相当轻松地编写自己的扩展方法:

    public static class StringExtensions
    {
        public static string ToSystemString(this IEnumerable<char> source)
        {
            return new string(source.ToArray());
        }
    }
    

    不幸的是,因为object.ToString 存在于所有 .NET 对象上,您必须为该方法指定一个不同的名称,以便编译器调用您的扩展方法,而不是内置的 ToString

    根据您在下面的评论,很高兴质疑这是否是正确的方法。因为String 通过它的公共方法公开了很多功能,所以我会将此方法作为String 本身的扩展来实现:

    /// <summary>
    /// Truncates a string to a maximum length.
    /// </summary>
    /// <param name="value">The string to truncate.</param>
    /// <param name="length">The maximum length of the returned string.</param>
    /// <returns>The input string, truncated to <paramref name="length"/> characters.</returns>
    public static string Truncate(this string value, int length)
    {
        if (value == null)
            throw new ArgumentNullException("value");
        return value.Length <= length ? value : value.Substring(0, length);
    }
    

    您可以按如下方式使用它:

    string SomeText = "this is some text in a string";
    return SomeText.Truncate(6);
    

    这样做的好处是,当字符串已经短于所需长度时,不会创建任何临时数组/对象。

    【讨论】:

    • 谢谢。这是一种“好的”做事方式吗?它是一个更大系统的一部分,我在其中传递一个 StringBuilder 和.Append()ing 大量数据来生成一个文件。我知道我不应该过早地进行优化,但是当有更简单的方法可以做到这一点时,我会以您建议浪费大量 cpu/内存的方式使用 LINQ?简而言之:您会在自己的项目中使用此代码将字符串修剪到一定长度吗?
    • @rtpHarry 好问题;我个人不会使用 LINQ 来完成此任务,并使用我选择的方法更新了我的答案。
    • 感谢您的额外反馈,我将根据此更新我的代码:)
    【解决方案2】:

    只需创建字符串

    string res = new string(SomeText.Take(6).ToArray());
    

    还要注意字符串原生方法

    string res = SomeText.Substring(0, 6);
    

    【讨论】:

    • 如果SomeText 少于六个字符,子字符串将被抛出;我假设 OP 想要一个行为类似于 Take 的方法(即,最多返回那么多字符,但如果输入字符串更短,则更少(无一例外)。
    【解决方案3】:

    我自己也遇到过几次,使用以下方法:

    string.Join(string.Empty,yourString.Take(5));
    

    【讨论】:

      【解决方案4】:

      SomeText.Take(6) 将返回一个IEnumerable of char of char,而ToString 方法不会返回您需要调用它的可疑字符串,如下所示:

      string [] array = SomeText.Take(6).ToArray();
      string result = new string(array);
      

      【讨论】:

        猜你喜欢
        • 2022-06-17
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多