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 将字符串修剪到一定长度?
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))..];