38

私は 3 つ (3 ~ 4 個を超えるジェネリック リストを持つこともできますが、この例では 3 つ) ジェネリック リストを持っています。

List<string> list1

List<string> list2

List<string> list3

すべてのリストには同じ数の要素があります (同じカウント)。

これを使用して、2 つのリストを ZIP で結合しました。

var result = list1.Zip(list2, (a, b) => new {
  test1 = f,
  test2 = b
}

次のように、各リストforeachを回避するために、ステートメントにそれを使用しましたforeach

foreach(var item in result){
Console.WriteLine(item.test1 + " " + item.test2);
}

3 つのリストに対して Zip で類似を使用するにはどうすればよいですか?

ありがとう

編集:

私は好きです:

List<string> list1 = new List<string>{"test", "otherTest"};

List<string> list2 = new List<string>{"item", "otherItem"};

List<string> list3 = new List<string>{"value", "otherValue"};

ZIP後(方法がわからない)、結果を出したい(VS2010デバッグモード)

[0] { a = {"test"},
      b = {"item"},
      c = {"value"}
    }   

[1] { a = {"otherTest"},
      b = {"otherItem"},
      c = {"otherValue"}
    }  

どうやってするか ?

4

7 に答える 7

46

私にとって最も明白な方法は、Zip2回使用することです。

例えば、

var results = l1.Zip(l2, (x, y) => x + y).Zip(l3, (x, y) => x + y);

List<int>3つのオブジェクトの要素を結合(追加)します。

アップデート:

Zip次のように、3つIEnumerableのsのように機能する新しい拡張メソッドを定義できます。

public static class MyFunkyExtensions
{
    public static IEnumerable<TResult> ZipThree<T1, T2, T3, TResult>(
        this IEnumerable<T1> source,
        IEnumerable<T2> second,
        IEnumerable<T3> third,
        Func<T1, T2, T3, TResult> func)
    {
        using (var e1 = source.GetEnumerator())
        using (var e2 = second.GetEnumerator())
        using (var e3 = third.GetEnumerator())
        {
            while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext())
                yield return func(e1.Current, e2.Current, e3.Current);
        }
    }
}

(上記と同じコンテキストでの)使用法は次のようになります。

var results = l1.ZipThree(l2, l3, (x, y, z) => x + y + z);

同様に、3つのリストを次のものと組み合わせることができます。

var results = list1.ZipThree(list2, list3, (a, b, c) => new { a, b, c });
于 2012-04-24T11:42:58.320 に答える
3

C# の多くのリストをカスケード zip メソッドと匿名クラスおよび Tuple 結果と組み合わせることができます。

List<string> list1 = new List<string> { "test", "otherTest" };
List<string> list2 = new List<string> { "item", "otherItem" };
List<string> list3 = new List<string> { "value", "otherValue" };

IEnumerable<Tuple<string, string, string>> result = list1
    .Zip(list2, (e1, e2) => new {e1, e2})
    .Zip(list3, (z1, e3) => Tuple.Create(z1.e1, z1.e2, e3));

結果は次のとおりです。

[0]
{(test, item, value)}
    Item1: "test"
    Item2: "item"
    Item3: "value"
于 2016-08-17T06:40:55.437 に答える
3

これは、可読性の高いコードを優先するか、Linq を使用した短いコードを優先するかを決定する必要があるケースの 1 つです。私はコードの可読性を優先しました。

class Program
{
    static void Main(string[] args)
    {
        List<string> list1 = new List<string> { "test", "otherTest" };
        List<string> list2 = new List<string> { "item", "otherItem" };
        List<string> list3 = new List<string> { "value", "otherValue" };

        var result = CombineListsByLayers(list1, list2, list3);
    }

    public static List<string>[] CombineListsByLayers(params List<string>[] sourceLists)
    {
        var results = new List<string>[sourceLists[0].Count];

        for (var i = 0; i < results.Length; i++)
        {
            results[i] = new List<string>();
            foreach (var sourceList in sourceLists)
                results[i].Add(sourceList[i]);
        }
        return results;
    }
于 2012-04-24T13:21:04.167 に答える
0

List<string>これらを組み合わせList<List<string>>て集約することができます

List<string> list1 = new List<string> { "test", "otherTest" };
List<string> list2 = new List<string> { "item", "otherItem" };
List<string> list3 = new List<string> { "value", "otherValue" };

var list = new List<List<string>>() { list1, list2, list3 }
    .Aggregate(
        Enumerable.Range(0, list1.Count).Select(e => new List<string>()),
        (prev, next) => prev.Zip(next, (first, second) => { first.Add(second); return first; })
    )
    .Select(e => new
    {
        a = e.ElementAt(0),
        b = e.ElementAt(1),
        c = e.ElementAt(2)
    });

結果

[
  {
    "a": "test",
    "b": "item",
    "c": "value"
  },
  {
    "a": "otherTest",
    "b": "otherItem",
    "c": "otherValue"
  }
]

dotnetfiddle.netを参照してください

于 2019-07-13T10:22:50.743 に答える