web-dev-qa-db-ja.com

IEnumerable <T>に単一のアイテムを追加するLinqメソッドはありますか?

基本的に私はこのようなことをしようとしています:

image.Layers

Parentレイヤーを除くすべてのレイヤーのIEnumerableを返しますが、場合によっては、次のようにしたいだけです。

image.Layers.With(image.ParentLayer);

image.Layersで満たされる通常の使用法の数百と比較して、数箇所でしか使用されないためです。 Parentレイヤーも返す別のプロパティを作成したくないのはそのためです。

53
Joan Venge

1つの方法は、アイテム(配列など)からシングルトンシーケンスを作成し、それを元のConcatに作成することです。

image.Layers.Concat(new[] { image.ParentLayer } )

これを頻繁に行う場合は、 ここにリストされている のようなAppend(または同様の)拡張メソッドの作成を検討してください。

image.Layers.Append(image.ParentLayer)
51
Ani

すでに多くの実装が提供されています。私の見た目は少し異なります(ただし、同様に機能します)

また、ORDERを制御することも実際的です。したがって、多くの場合、ConcatToメソッドもあり、新しい要素をopの前に置きます。

public static class Utility
{
    /// <summary>
    /// Adds the specified element at the end of the IEnummerable.
    /// </summary>
    /// <typeparam name="T">The type of elements the IEnumerable contans.</typeparam>
    /// <param name="target">The target.</param>
    /// <param name="item">The item to be concatenated.</param>
    /// <returns>An IEnumerable, enumerating first the items in the existing enumerable</returns>
    public static IEnumerable<T> ConcatItem<T>(this IEnumerable<T> target, T item)
    {
        if (null == target) throw new ArgumentException(nameof(target));
        foreach (T t in target) yield return t;
        yield return item;
    }

    /// <summary>
    /// Inserts the specified element at the start of the IEnumerable.
    /// </summary>
    /// <typeparam name="T">The type of elements the IEnumerable contans.</typeparam>
    /// <param name="target">The IEnummerable.</param>
    /// <param name="item">The item to be concatenated.</param>
    /// <returns>An IEnumerable, enumerating first the target elements, and then the new element.</returns>
    public static IEnumerable<T> ConcatTo<T>(this IEnumerable<T> target, T item)
    {
        if (null == target) throw new ArgumentException(nameof(target));
        yield return item;
        foreach (T t in target) yield return t;
    }
}

または、暗黙的に作成された配列を使用します。 (paramsキーワードを使用)、メソッドを呼び出して一度に1つ以上のアイテムを追加できます。

public static class Utility
{
    /// <summary>
    /// Adds the specified element at the end of the IEnummerable.
    /// </summary>
    /// <typeparam name="T">The type of elements the IEnumerable contans.</typeparam>
    /// <param name="target">The target.</param>
    /// <param name="items">The items to be concatenated.</param>
    /// <returns>An IEnumerable, enumerating first the items in the existing enumerable</returns>
    public static IEnumerable<T> ConcatItems<T>(this IEnumerable<T> target, params T[] items) =>
        (target ?? throw new ArgumentException(nameof(target))).Concat(items);

    /// <summary>
    /// Inserts the specified element at the start of the IEnumerable.
    /// </summary>
    /// <typeparam name="T">The type of elements the IEnumerable contans.</typeparam>
    /// <param name="target">The IEnummerable.</param>
    /// <param name="items">The items to be concatenated.</param>
    /// <returns>An IEnumerable, enumerating first the target elements, and then the new elements.</returns>
    public static IEnumerable<T> ConcatTo<T>(this IEnumerable<T> target, params T[] items) =>
        items.Concat(target ?? throw new ArgumentException(nameof(target)));
26
realbart

これを行う単一の方法はありません。最も近いのはEnumerable.Concatメソッド。ただし、IEnumerable<T> 他のと IEnumerable<T>。次を使用して、単一の要素で動作させることができます

image.Layers.Concat(new [] { image.ParentLayer });

または、新しい拡張メソッドを追加するだけです

public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> enumerable, T value) {
  return enumerable.Concat(new [] { value });
}
12
JaredPar

AppendPrependが.NET Standardフレームワークに追加されたため、独自に記述する必要はありません。これを行うだけです:

image.Layers.Append(image.ParentLayer)

新機能の優れたリストについては、 。Net Standard 2.0にあるが.Net Framework 4.6.1にはない43個のAPIとは を参照してください。

10
cbp

Enumerable.Concat を使用できます。

var allLayers = image.Layers.Concat(new[] {image.ParentLayer});
7
Reed Copsey

次のようなことができます:

image.Layers.Concat(new[] { image.ParentLayer });

追加したいものを含む単一要素の配列に列挙型を連結します

5
thecoop

私はかつてこれのために素敵な小さな関数を作成しました:

public static class CoreUtil
{    
    public static IEnumerable<T> AsEnumerable<T>(params T[] items)
    {
        return items;
    }
}

これが可能になりました:

image.Layers.Append(CoreUtil.AsEnumerable(image.ParentLayer, image.AnotherLayer))
5
Gert Arnold

次の拡張メソッドを使用して、無駄なArrayを作成しないようにします。

public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> enumerable, T value) {
   return enumerable.Concat(value.Yield());
}

public static IEnumerable<T> Yield<T>(this T item) {
    yield return item;
}
3
Erwin Mayer

.Withの構文が好きな場合は、拡張メソッドとして記述してください。 IEnumerableは別のものに気付かないでしょう。

3
James Gaunt

2つのシーケンスを結合する Concat メソッドがあります。

1
Michael Stum
/// <summary>Concatenates elements to a sequence.</summary>
/// <typeparam name="T">The type of the elements of the input sequences.</typeparam>
/// <param name="target">The sequence to concatenate.</param>
/// <param name="items">The items to concatenate to the sequence.</param>
public static IEnumerable<T> ConcatItems<T>(this IEnumerable<T> target, params T[] items)
{
    if (items == null)
        items = new [] { default(T) };
    return target.Concat(items);
}

このソリューションは、 realbartの答え に基づいています。単一のnull値をパラメーターとして使用できるように調整しました。

var newCollection = collection.ConcatItems(null)
0
Tim Pohlmann