基本的に私はこのようなことをしようとしています:
image.Layers
Parent
レイヤーを除くすべてのレイヤーのIEnumerableを返しますが、場合によっては、次のようにしたいだけです。
image.Layers.With(image.ParentLayer);
image.Layers
で満たされる通常の使用法の数百と比較して、数箇所でしか使用されないためです。 Parent
レイヤーも返す別のプロパティを作成したくないのはそのためです。
1つの方法は、アイテム(配列など)からシングルトンシーケンスを作成し、それを元のConcat
に作成することです。
image.Layers.Concat(new[] { image.ParentLayer } )
これを頻繁に行う場合は、 ここにリストされている のようなAppend
(または同様の)拡張メソッドの作成を検討してください。
image.Layers.Append(image.ParentLayer)
すでに多くの実装が提供されています。私の見た目は少し異なります(ただし、同様に機能します)
また、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)));
これを行う単一の方法はありません。最も近いのは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 });
}
Append
とPrepend
が.NET Standardフレームワークに追加されたため、独自に記述する必要はありません。これを行うだけです:
image.Layers.Append(image.ParentLayer)
新機能の優れたリストについては、 。Net Standard 2.0にあるが.Net Framework 4.6.1にはない43個のAPIとは を参照してください。
Enumerable.Concat を使用できます。
var allLayers = image.Layers.Concat(new[] {image.ParentLayer});
次のようなことができます:
image.Layers.Concat(new[] { image.ParentLayer });
追加したいものを含む単一要素の配列に列挙型を連結します
私はかつてこれのために素敵な小さな関数を作成しました:
public static class CoreUtil
{
public static IEnumerable<T> AsEnumerable<T>(params T[] items)
{
return items;
}
}
これが可能になりました:
image.Layers.Append(CoreUtil.AsEnumerable(image.ParentLayer, image.AnotherLayer))
次の拡張メソッドを使用して、無駄な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;
}
.Withの構文が好きな場合は、拡張メソッドとして記述してください。 IEnumerableは別のものに気付かないでしょう。
2つのシーケンスを結合する Concat メソッドがあります。
/// <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)