10

クラスStringには非常に便利なメソッドが含まれています - String.Join(string, string[]).

配列から文字列を作成し、配列の各要素を指定された記号で区切ります。しかし、一般的には、最後の要素の後にセパレーターを追加しません! " <br />" またはEnvironment.NewLine.

そのため、 の各行の後に空の行を追加したいと思いasp:Tableます。IEnumerable<TableRow>同じ機能にどのような方法を使用できますか?

4

9 に答える 9

9

に相当するLinqString.JoinAggregate

例えば:

IEnumerable<string> strings;
string joinedString = strings.Aggregate((total,next) => total + ", " + next);

TableRows の IE が与えられた場合、コードは同様になります。

于 2010-04-18T13:21:55.340 に答える
8

.NET 3.5 では、次の拡張メソッドを使用できます。

public static string Join<TItem>(this IEnumerable<TItem> enumerable, string separator)
{
   return string.Join(separator, enumerable.Select(x => x.ToString()).ToArray());
}

または.NET 4で

public static string Join<TItem>(this IEnumerable<TItem> enumerable, string separator)
{
   return string.Join(separator, enumerable);
}

しかし、質問では、これ(3.5バージョン)が機能する最後の要素を含む各要素の後にセパレーターが必要でした:-

public static string AddDelimiterAfter<TItem>(this IEnumerable<TItem> enumerable, string delimiter)
{
   return string.Join("", enumerable.Select(x => x.ToString() + separator).ToArray());
}

.Aggregate を使用して、拡張メソッドなしでこれを行うこともできます。

于 2010-04-18T06:07:47.420 に答える
8

私は拡張メソッドを書きました:

    public static IEnumerable<T> 
        Join<T>(this IEnumerable<T> src, Func<T> separatorFactory)
    {
        var srcArr = src.ToArray();
        for (int i = 0; i < srcArr.Length; i++)
        {
            yield return srcArr[i];
            if(i<srcArr.Length-1)
            {
                yield return separatorFactory();
            }
        }
    }

次のように使用できます。

tableRowList.Join(()=>new TableRow())
于 2009-06-14T20:05:32.223 に答える
1

あなたが探しているのはIntersperse関数です。このような関数の LINQ 実装については、この質問を参照してください。


ちなみに、別の可能性のある類似物String.JoinIntercalate関数です。これは実際に私が探していたものです。

public static IEnumerable<T> Intercalate<T>(this IEnumerable<IEnumerable<T>> source,
                                            IEnumerable<T> separator) {
    if (source == null) throw new ArgumentNullException("source");
    if (separator == null) throw new ArgumentNullException("separator");
    return source.Intersperse(separator)
        .Aggregate(Enumerable.Empty<T>(), Enumerable.Concat);
}
于 2010-11-02T20:09:49.540 に答える
1

これを行うための組み込みメソッドはありません。独自のロールを作成する必要があります。

于 2009-06-14T19:34:01.130 に答える
1

自分のニーズに合った方法が見つからない場合は、自分で作成するだけです。拡張メソッドは、そのようなものを拡張できるので、そのように非常に優れています。asp:tableについてはあまり知りませんが、少なくとも何にでも微調整できる拡張メソッドがあります:p

public static class TableRowExtensions
{
    public string JoinRows(this IEnumerable<TableRow> rows, string separator)
    {
        // do what you gotta do
    }
}
于 2009-06-14T20:04:45.843 に答える
0

このようなことを頻繁に行う場合は、それを行う独自の拡張メソッドを作成する価値があります。以下の実装でstring.Join(", ", arrayOfStrings)は、arrayOfStrings が でありIEnumerable<T>、セパレーターが任意のオブジェクトである場合と同等のことを行うことができます。次のようなことができます。

var names = new [] { "Fred", "Barney", "Wilma", "Betty" };
var list = names
    .Where(n => n.Contains("e"))
    .Join(", ");

これについて私が気に入っている点は次の 2 つです。

  1. LINQ コンテキストでは非常に読みやすいです。
  2. StringBuilder を使用し、列挙の 2 回の評価を回避するため、かなり効率的です。
public static string Join<TItem,TSep>(
    this IEnumerable<TItem> enuml,
    TSep                    separator)
{
    if (null == enuml) return string.Empty;

    var sb = new StringBuilder();

    using (var enumr = enuml.GetEnumerator())
    {
        if (null != enumr && enumr.MoveNext())
        {
            sb.Append(enumr.Current);
            while (enumr.MoveNext())
            {
                sb.Append(separator).Append(enumr.Current);
            }
        }
    }

    return sb.ToString();
}
于 2010-04-17T13:51:00.003 に答える