6

これを行う最も簡単な方法は何ですか?

結果は次のようになります。

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)
        {
            //???
        }
    }
}
4

8 に答える 8

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);
    }
}

これは既存のリストを変更しないことに注意してください。目的のコンテンツを含む新しいリストが返されます。メソッドに戻り値の型を指定したため、どのような動作が必要かは明確ではありませんでしたが、サンプルでは結果を使用せずに呼び出しています。名前を変更する価値はあるかもしれませんが、個人的には副作用のない方法を好みます:)

于 2010-02-24T10:37:44.927 に答える
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);
        }
    }

署名が例から変更されていることに注意してください(戻り値の型は無効です)。

于 2010-02-24T10:38:03.113 に答える
5

これを試してください:

public static List<string> TrimList(this List<string> list)  
    {  
        return list.SkipWhile(l => String.IsNullOrEmpty(l)).Reverse().SkipWhile(l => String.IsNullOrEmpty(l)).Reverse();
    } 
于 2010-02-24T10:42:50.607 に答える
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);
}
于 2010-02-24T10:42:15.133 に答える
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;
        }
    }
}
于 2010-02-24T10:44:20.983 に答える
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));
于 2010-02-24T10:46:20.527 に答える
0

空の文字列を削除したい場合は、次のようにすることができます...

lines = lines.Where(s => ! string.IsNullOrEmpty(s)).ToList();

更新:内部の空白を残したいという編集を見て申し訳ありません。

この場合、私はそれを行う簡単な方法はないと思うので、あなたが上で述べたような拡張メソッドだけを使います。

于 2010-02-24T10:35:54.463 に答える