Substring()的问题 – ArgumentOutOfRangeException
我有一个转发器,显示我的Projects表中的数据。 有projectId,名称和描述。 我在描述中使用了Substring(1,240)。 但有时字符串短于240,所以我得到了ArgumentOutOfRangeException。 如果我收到exception,你能告诉我如何显示整个文本吗? 这是我的代码。
Проекти
<asp:Label ID="LblProjectId" runat="server" Text='' /> <asp:Label ID="LblName" runat="server" Text='' /> <asp:Label ID="LblDescription" runat="server" Text=''/> <asp:HyperLink ID="HlMore" runat="server" NavigateUrl='' Text="More" />
protected override void OnPreRender(EventArgs e) { var table = Projects.GetTableWithProjects(); if (table.Rows.Count > 0) { rptrProjects.DataSource = table; rptrProjects.DataBind(); } else { pnlDisplayProjects.Visible = false; Master.PrintMessage("There are no projects."); } }
string dec = "description"; string result = dec.Substring( 0, dec.Length > 240 ? 240 : dec.Length )
如果您使用的是.NET 3.5,我建议您编写一个单独的扩展方法。 像这样的东西:
public static string SafeSubstring(this string text, int start, int length) { return text.Length <= start ? "" : text.Length - start <= length ? text.Substring(start) : text.Substring(start, length); }
基本上这是Substring
的一个版本,它永远不会抛出exception,除非start或length是否定的(在这种情况下我不知道它能合理地返回什么)。
你这样称呼它:
Eval("Description").ToString().SafeSubstring(1, 240) + "..."
这样做的缺点是它会包含省略号(...),即使它实际上根本没有截断字符串......
description.Substring(0, Math.Min(description.Length, 240));
扩展方法:
public static string SafeSubstring(this string text, int start, int length) { if (start >= text.Length) return ""; if (start + length > text.Length) length = text.Length - start; return text.Substring(start, length); }
根据Jon Skeet的回答,我认为应该检查null,否则它不是一个安全的方法:)
public static string SafeSubstring(this string text, int start, int length) { if (text == null) return null; return text.Length <= start ? "" : text.Length - start <= length ? text.Substring(start) : text.Substring(start, length); }
我会写一个静态辅助函数或扩展方法。
public static string SafeSubstring(string str, int start, int count){ int n = str.Length; return str.Substring(Math.Min(start,n), Math.Min(count,n)); }
然后使用:
<%# SafeSubstring(Eval("Description",""), 1, 240) %>
(如果你还想对负整数保持安全, Math.Max
在那里抛出一些带有0的Math.Max
。)
您可以使用LINQ,如下所示:
string someString = "abcde"; string subStr = string.Join("", someString.Take(240));
这有点像黑客,但最简单的方法是改变:
Eval("Description").ToString().Substring(1,240)
至
Eval("Description").ToString().PadRight(240).Substring(1, 240)
我不确定这方面的性能考虑,但是,如果有很多项目。
如果由于某种原因需要在该位置使用240个字符,则可以将来自数据库的字段作为char(241)
在这种情况下,它将始终为241个字符,如果字段的内容为短于241个字符。 然后你仍然可以像现在一样用Substring(1, 240)
剥离第一个字符。
虽然,我一定不知道你是不是想要做一个Substring(0, 240)
,如果字符串短于240个字符就不会抛出exception,并且会从字符串的开头开始,而不是第二个字符。
另一种选择是编写一个你调用的方法,这样你的eval变成了:
<%# GetString(Container.DataItem) %>
因此,在方法中,您可以检查以确保该项为非null,因为您可能会在NULL项目上弹出.ToString。 然后,您可以评估容器项并将长度传递给子字符串调用。
Text='<%# Eval("Description").ToString().Substring(1, Math.Min(240, Eval("Description").ToString().Length - 1)) + "..." %>'
让我们试着保持这个简单……
我们只需要截断到给定的最大长度,那么我们如何称它为它:
description.TruncateTo(240);
启用上述function的扩展方法(如果截断,则默认附加省略号):
public static class StringExtensions { public static string TruncateTo(this string val, int maxLength, bool ellipsis = true) { if (val == null || val.Length <= maxLength) { return val; } ellipsis = ellipsis && maxLength >= 3; return ellipsis ? val.Substring(0, maxLength - 3) + "..." : val.Substring(0, maxLength); } }