你知道采用逗号分隔字符串的最佳/最干净方式是什么,例如“A,B,C,D,E,F,G”,并且只返回列表中第1个数量的项目?因此,如果x = 5,那么结果将是“A,B,C,D,E”。
我知道有不同的方法可以做到这一点:“for循环”计算逗号,然后截断字符串;将字符串拆分为数组或列表,然后删除最后x个项目。
我不知道有更清洁,更有效的选择吗?你会怎么做?
提前致谢!! 格雷格
答案 0 :(得分:5)
我会将任务分成两部分:
幸运的是,C#使这两者非常简单,String.Split
处理第一个,而LINQ Take
方法处理第二个:
var items = text.Split(',')
.Take(itemLimit);
或者如果您想创建一个列表:
var items = text.Split(',')
.Take(itemLimit)
.ToList();
我会不将其转换回逗号分隔的字符串,除非你真的需要。尽可能长时间保持数据的最自然表示(例如List<string>
)。如果需要,只需使用String.Join
。
你可以潜在地通过编写一个“懒惰的分离器”来提高Split
部分的效率 - 但它会起到很小的作用,IMO,除非你期望得到一个非常好的长字符串,只想保留一些项目。它会像这样看起来:
public static IEnumerable<string> LazySplit(this string text, string separator)
{
int start = 0;
while (true)
{
int end = text.IndexOf(separator, start);
if (end == -1)
{
// Note: if the string ends with the separator, this will yield
// an empty string
yield return text.Substring(start);
yield break; // This will terminate the otherwise-infinite loop
}
yield return text.Substring(start, end - start);
start = end + separator.Length;
}
}
然后使用代码与之前类似:
var items = text.LazySplit(",")
.Take(itemLimit)
.ToList();
或者,如果你真的,真的需要将它保存在字符串中,你可以写一些东西来找到第N个逗号,并且只需使用Substring
来获取第一部分字符串:
// TODO: Improve the name :)
public static string TruncateAfterSeparatorCount(string text,
string separator,
int count)
{
// We pretend that the string "starts" with a separator before index 0.
int index = -separator.Length;
for (int i = 0; i < count; i++)
{
int nextIndex = text.IndexOf(separator, index + separator.Length);
// Not enough separators. Return the whole string. Could throw instead.
if (nextIndex == -1)
{
return text;
}
index = nextIndex;
}
// We need to handle the count == 0 case, where index will be negative...
return text.Substring(0, Math.Max(index, 0));
}
但正如我所说,如果可能,我会亲自尝试使用List<string>
方法。上述代码显然比Split
/ Take
/ ToList
复杂得多,即使它更有效。只有在证明有需要时才使用更高效但更复杂的代码。
答案 1 :(得分:3)
试试这个:
string.Join("," , str.Split(",").Take(5));
或者,如果你经常这样做,你可以为此编写一个扩展方法。
答案 2 :(得分:0)
试试这个:
string yourString = "A,B,C,D,E,F,G";
List<string> items = yourString.Split(',')
.Take(5)
.ToList();
string output = string.Join(",", items);
答案 3 :(得分:0)
string[] words = s.Split(',').Take(5);
答案 4 :(得分:0)
string[] List = SubList(5);
string Output = string.Join(",", List);
private string[] SubList(int p)
{
string[] List = new string[] { "A", "B", "C", "D", "E", "F" };
string[] List2 = new string[p];
for (int i = 0; i < p; i++)
List2[i] = List[i];
return List2;
}
答案 5 :(得分:0)
如果您只想使用String
方法(而非Take()),这应该可行:
string.Join(",", s.Split(","), 0, 5);
如果你知道每个元素只有一个字符,你可以这样做:
s.Substring(0, 2*x - 1);
答案 6 :(得分:0)
只是为了好玩 - 仅使用正则表达式/字符串方法(我不会使用正则表达式来实现这个现实世界 - 然后我会two problems):
string.SubString(0,Regex.Matches(string,",")[x-1].Index);