2011-02-10 11 views
40

私は2セットのdatarowsを持っています。それらはそれぞれIEnumerableです。これらの2つのリストを1つのリストに追加/連結したいと思います。私はこれが実行可能であると確信しています。私はforループをしたくないし、2つのリストにUnionメソッドとJoinメソッドがあることに気づいた。何か案は?2つのIEnumerableシーケンスの追加/連結

+0

同じタイプのデータローのセットはありますか?他の種類? – Oded

+0

@Obed ....彼らは同じタイプです – MikeTWebb

答えて

87

オブジェクトのタイプが同じであると仮定すると、UnionまたはConcatのいずれかを使用できます。 SQL UNIONキーワードのように、Unionオペレーションでは重複が排除されますが、ConcatUNION 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のインスタンスに変換する操作を表します。

+0

@アダム...幻想的な....ちょうど私が必要なもの – MikeTWebb

+0

@アダム....私はあまりにも早く話しました。私は連合をやっている私は重複レコードを取得している。何らかの種類のキープロパティを初期化するためにIneedを実行しますか? – MikeTWebb

+1

@MikeTWebb: 'Union'には、IEqualityComparerを指定できるオーバーロードがあります。 –

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(); 
} 
関連する問題