私は2セットのdatarowsを持っています。それらはそれぞれIEnumerableです。これらの2つのリストを1つのリストに追加/連結したいと思います。私はこれが実行可能であると確信しています。私はforループをしたくないし、2つのリストにUnionメソッドとJoinメソッドがあることに気づいた。何か案は?2つのIEnumerableシーケンスの追加/連結
40
A
答えて
87
オブジェクトのタイプが同じであると仮定すると、Union
またはConcat
のいずれかを使用できます。 SQL UNION
キーワードのように、Union
オペレーションでは重複が排除されますが、Concat
(UNION ALL
など)は、最初の2番目のリストを最後に追加するだけです。彼らは異なるタイプである場合
IEnumerable<T> first = ...;
IEnumerable<T> second = ...;
IEnumerable<T> combined = first.Concat(second);
または
IEnumerable<T> combined = first.Union(second);
は、その後、あなたは一般的な何かにそれらSelect
する必要があります。例えば:
IEnumerable<TOne> first = ...;
IEnumerable<TTwo> second = ...;
IEnumerable<T> combined = first.Select(f => ConvertToT(f)).Concat(
second.Select(s => ConvertToT(s)));
ConvertToT(TOne f)
とConvertToT(TTwo s)
はT
のインスタンスに(それぞれ、及びTTwo
)何とかTOne
のインスタンスに変換する操作を表します。
1
私は、複数のシーケンスを連結する必要がある同様の状況に遭遇しました。
Google/StackOverflow上の既存のソリューションが当然検索されましたが、列挙型を評価しなかったものは見つかりませんでした。配列に変換してArray.Copy()
などを使用するので、私はConcatMultiple
と呼ばれる拡張と静的utiltiyメソッドを書いた。
これは、同じことを行う必要がある人に役立ちます。
/// <summary>
/// Concatenates multiple sequences
/// </summary>
/// <typeparam name="TSource">The type of the elements of the input sequences.</typeparam>
/// <param name="first">The first sequence to concatenate.</param>
/// <param name="source">The other sequences to concatenate.</param>
/// <returns></returns>
public static IEnumerable<TSource> ConcatMultiple<TSource>(this IEnumerable<TSource> first, params IEnumerable<TSource>[] source)
{
if (first == null)
throw new ArgumentNullException("first");
if (source.Any(x => (x == null)))
throw new ArgumentNullException("source");
return ConcatIterator<TSource>(source);
}
private static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, params IEnumerable<TSource>[] source)
{
foreach (var iteratorVariable in first)
yield return iteratorVariable;
foreach (var enumerable in source)
{
foreach (var iteratorVariable in enumerable)
yield return iteratorVariable;
}
}
/// <summary>
/// Concatenates multiple sequences
/// </summary>
/// <typeparam name="TSource">The type of the elements of the input sequences.</typeparam>
/// <param name="source">The sequences to concatenate.</param>
/// <returns></returns>
public static IEnumerable<TSource> ConcatMultiple<TSource>(params IEnumerable<TSource>[] source)
{
if (source.Any(x => (x == null)))
throw new ArgumentNullException("source");
return ConcatIterator<TSource>(source);
}
private static IEnumerable<TSource> ConcatIterator<TSource>(params IEnumerable<TSource>[] source)
{
foreach (var enumerable in source)
{
foreach (var iteratorVariable in enumerable)
yield return iteratorVariable;
}
}
1
Join方法は、リストがクロス状態に基づいて参照されているSQL参加、似ている、それは文字列連結又はリストへの追加はありません。 Unionメソッドは、Concatメソッドのように必要な処理を行いますが、どちらもLAZY評価であり、パラメータがnullでないという要件があります。それらはConcatIteratorまたはUnionIteratorとif called repeatedly this could cause problemsのいずれかを返します。熱心な評価結果が違う場合は、以下のような拡張メソッドを使用できます。
public static IEnumerable<T> myEagerConcat<T>(this IEnumerable<T> first,
IEnumerable<T> second)
{
return (first ?? Enumerable.Empty<T>()).Concat(
(second ?? Enumerable.Empty<T>())).ToList();
}
関連する問題
- 1. を連結2つのクエリセット
- 2. 2つのIEnumerable <T>を新しいIEnumerable <T>に連結する方法はありますか
- 3. を連結2つの辞書
- 4. を連結2つのFuncデリゲート
- 5. JFreeChartで2つのXYSeriesを連結
- 6. Doctrine 2 preFlushイベント関連クラスの追加
- 7. 2つのドロップリストを関連するテーブルに追加する
- 8. 2つのmysqlクエリの結果を追加する
- 9. 2つのクエリを追加
- 10. 2つの配列を結合(追加)する方法は?
- 11. テンプレートヘルパーで2つのクエリの結果を連結
- 12. Googleスプレッドシートを2つ連結する
- 13. を連結2つ(またはn)は
- 14. 1つの入力フィールド値を角型の別のフィールドに連結(追加)
- 15. 2つの範囲関数結果を連結する
- 16. 2つのリストを1つのC#質問に連結する
- 17. リストの追加と連結の複雑さの差
- 18. Clojureのシーケンスにカスタムビヘイビアを追加する
- 19. Mysqlで2つの異なるクエリの結果を追加する
- 20. 同じクエリで2つのselectコマンドの結果を追加する方法
- 21. 2つの角度を追加する
- 22. 2つのXMlDocumentを追加するC#
- 23. パンダのデータフレームを2つ追加する
- 24. SQLで2つのタイムスタンプを追加
- 25. ドロップダウンリストの2つのフィールドを連結します。
- 26. 2つの列の値を連結する
- 27. LINQで異なるタイプの2つのリストを連結する
- 28. 2つの二重リストを連結する+演算子のオーバーロード
- 29. SQLサーバー:2つの数値列の値を連結する
- 30. 異なるタイプの2つのリストを連結する
同じタイプのデータローのセットはありますか?他の種類? – Oded
@Obed ....彼らは同じタイプです – MikeTWebb