如何'.Take()' 在字符串上,并在末尾获取一个字符串

本文关键字:字符串 获取 一个 如何 Take | 更新日期: 2023-09-27 17:57:05

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]

在这个问题中,这被讨论为"意外",但这是我实际想要做的,我无法通过搜索任何地方找到它。

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

如何'.Take()' 在字符串上,并在末尾获取一个字符串

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

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

遗憾的是,由于所有 .NET 对象上都存在object.ToString,因此必须为该方法指定不同的名称,以便编译器将调用扩展方法,而不是内置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);

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

只需创建字符串

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

还要注意字符串本机方法

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

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

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

SomeText.Take(6)将返回字符的IEnumerable,并且ToString方法不会返回您需要像下面这样调用它的可疑字符串:

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

查找有关 LINQ 和字符串时发现了这个问题。

在返回数据类型时,可以使用IEnumerable<char>而不是string。还可以在如何查询字符串中的字符 (LINQ) (C#) 中了解有关它的详细信息

这是解决方案。

public class Program
{
    public static void Main()
    {
        foreach (var c in LinqString())
        {
            Console.WriteLine(c);
        }
        //OR
        Console.WriteLine(LinqString().ToArray());
    }
    private static IEnumerable<char> LinqString()
    {
        //This is Okay too...
        //IEnumerable<char> SomeText = "this is some text in a string";
        string SomeText = "this is some text in a string";
        
        return SomeText.Skip(4).Take(6);
    }
}

使用 C# 8 及更高版本...

抓取最后 6 位数字(如果输入少于 8 个字符,则失败

string SomeText = "this is some text in a string";
string result =  SomeText[^6..];

一个受保护的版本,可以处理少于 6 个字符的字符串...

string SomeText = "this is some text in a string";
string result = SomeText[^(Math.Min(6, SomeText.Length))..];