最简单的方法是什么?
结果应该是:
1: one
2: two
3:
4:
5: five
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestLines8833
{
class Program
{
static void Main(string[] args)
{
List<string> lines = new List<string>();
lines.Add("");
lines.Add("one");
lines.Add("two");
lines.Add("");
lines.Add("");
lines.Add("five");
lines.Add("");
lines.Add("");
lines.TrimList();
}
}
public static class Helpers
{
public static List<string> TrimList(this List<string> list)
{
//???
}
}
}
答案 0 :(得分:9)
好的,现在我理解了预期的结果:
public static class Helpers
{
// Adjust this to use trimming, avoid nullity etc if you you want
private static readonly Predicate<string>
NonBlankLinePredicate = x => x.Length != 0;
public static List<string> TrimList(this List<string> list)
{
int start = list.FindIndex(NonBlankLinePredicate);
int end = list.FindLastIndex(NonBlankLinePredicate);
// Either start and end are both -1, or neither is
if (start == -1)
{
return new List<string>();
}
return list.GetRange(start, end - start + 1);
}
}
请注意,此不会更改现有列表 - 它会返回包含所需内容的新列表。由于您已经为方法提供了返回类型,但是您的示例在不使用结果的情况下调用它,因此不清楚您想要的行为。我个人更喜欢非副作用的方法,虽然可能值得更改名称:)
答案 1 :(得分:6)
这个怎么样:
public static void TrimList(this List<string> list) {
while (0 != list.Count && string.IsNullOrEmpty(list[0])) {
list.RemoveAt(0);
}
while (0 != list.Count && string.IsNullOrEmpty(list[list.Count - 1])) {
list.RemoveAt(list.Count - 1);
}
}
请注意,签名已从您的示例更改(返回类型为void)。
答案 2 :(得分:5)
试试这个:
public static List<string> TrimList(this List<string> list)
{
return list.SkipWhile(l => String.IsNullOrEmpty(l)).Reverse().SkipWhile(l => String.IsNullOrEmpty(l)).Reverse();
}
答案 3 :(得分:1)
旧问题我知道,但这是一个扩展方法,它将使用Linq基于布尔委托从集合的开头和结尾修剪对象。
public static class IEnumerableExtensions
{
public static IEnumerable<T> Trim<T>( this IEnumerable<T> collection, Func<T, bool> trimCondition )
{
return collection.SkipWhile( trimCondition ).Reverse().SkipWhile( trimCondition ).Reverse();
}
}
您的案例示例:
lines.Trim(line => string.IsNullOrEmpty(line));
答案 4 :(得分:0)
如果你想删除空字符串,你可以做这样的事情......
lines = lines.Where(s => ! string.IsNullOrEmpty(s)).ToList();
更新:很抱歉,您刚看到自己想要保留内部空白的编辑内容。
在这种情况下,我只会像上面提到的那样使用扩展方法,因为我认为没有更简单的方法。
答案 5 :(得分:0)
没有内置任何特定的东西。您可以从开头和结尾检查项目并删除空字符串。要最小化列表上的操作(反复使用RemoveAt删除第一个项目的效率相当低),首先要计算要删除的项目数,然后使用RemoveRange
方法一次删除它们。
要匹配您在代码中使用该方法的方式,扩展程序必须更改列表而不是返回新列表。
public static void TrimList(this List<string> list) {
int cnt = 0;
while (cnt < list.Count && list[cnt].Length == 0) cnt++;
if (cnt > 0) list.RemoveRange(0, cnt);
cnt = 0;
while (cnt < list.Count - 1 && list[list.Count - cnt - 1].Length == 0) cnt++;
if (cnt > 0) list.RemoveRange(list.Count - cnt, cnt);
}
答案 6 :(得分:0)
从可读性和性能的角度来看,有时候好老的foreach击败了linq:
public static List<string> TrimList(this List<string> list)
{
list.TrimListStart();
vat l = list.Reverse().ToList();
l.TrimListStart();
return l;
}
public void TrimListStart(this List<string> list)
{
foreach(var s in new List(list))
{
if(string.string.IsNullOrWhiteSpace(s))
{
list.Remove(s);
}
else
{
break;
}
}
}
答案 7 :(得分:0)
int start = stringList.FindIndex((i => i.Trim() != ""));
int end = stringList.FindLastIndex((i => i.Trim() != ""));
List<string> range = new List<string>();
if(start != -1 && end != -1)
range = stringList.GetRange(start, (end - start + 1));