rtp*_*rry 24 c# linq string linq-to-objects take
LINQ to Objects支持对字符串对象的查询,但是当我使用如下代码时:
string SomeText = "this is some text in a string";
return SomeText.Take(6).ToString();
Run Code Online (Sandbox Code Playgroud)
我得到的只是:
System.Linq.Enumerable+<TakeIterator>d__3a`1[System.Char]
Run Code Online (Sandbox Code Playgroud)
在这个问题中,这被视为"意外",但这正是我实际上要做的事情,我无法通过任何地方的搜索找到它.
我知道还有其他方法可以操作字符串,但后来我也知道你可以用LINQ做一些非常酷的技巧,我想知道是否有办法用LINQ修剪字符串到一定的长度?
Bra*_*ger 19
System.Linq中没有内置方法来执行此操作,但您可以非常轻松地编写自己的扩展方法:
public static class StringExtensions
{
public static string ToSystemString(this IEnumerable<char> source)
{
return new string(source.ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,因为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);
}
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式使用它:
string SomeText = "this is some text in a string";
return SomeText.Truncate(6);
Run Code Online (Sandbox Code Playgroud)
这具有当字符串已经短于期望长度时不创建任何临时数组/对象的优点.
Ste*_*cya 18
只需创建字符串
string res = new string(SomeText.Take(6).ToArray());
Run Code Online (Sandbox Code Playgroud)
还要注意字符串本机方法
string res = SomeText.Substring(0, 6);
Run Code Online (Sandbox Code Playgroud)
小智 7
我自己遇到过几次并使用以下内容:
string.Join(string.Empty,yourString.Take(5));
Run Code Online (Sandbox Code Playgroud)