0

異なるアイテムの 3 つのリストがあるとします。これらのリストのいずれかからアイテムをインデックスで返す必要があります。インデックスは 0 から までの数値Count(<all lists items>)です。

例:

lists 1: 10 items;
lists 2: 5 item;
lists 3: 1 item;

したがって、インデックスは 0 から 15 の間である必要があります。インデックスによる項目:

0: lists 1, item 0;
1: lists 2, item 0:
2: lists 3, item 0;
3: lists 1, item 1;
4: lists 2, item 1;
5: lists 1, item 2;
6: lists 2, item 2;
7: lists 1, item 3;
8: lists 2, item 3;
9: lists 1, item 4;
10: lists 2, item 4;
11: lists 1, item 5;
12: lists 1, item 6;
13: lists 1, item 7;
14: lists 1, item 8;
15: lists 1, item 9;

(完全な結果で申し訳ありません。それは私自身の理解度チェックのためです)。

最適な方法は次のとおりです。

  • 使用するリストを決定する
  • 項目を取得するために使用するリストのインデックスは?

考えられる解決策:

  1. すべてのリストのすべての項目を 1 つの大きなリストにまとめます。大きなリストのすべての項目には、次のものが含まれている必要があります。リストのインデックス。リストからの項目 (または項目のインデックス)。
  2. インデックスが到着したら、大きなリストから簡単にアイテムを返します。
4

3 に答える 3

1

ここに簡単な解決策があります。すべてのリストを渡して、それらの列挙子を取得できます。次に、いくつかの結果を返すことができる間に列挙子を反復処理します

public static IEnumerable<T> EnumerateAll<T>(params IEnumerable<T>[] lists)
{
    var enumerators = lists.Select(l => l.GetEnumerator());

    while (enumerators.Any())
    {
        enumerators = enumerators.Where(e => e.MoveNext());

        foreach (var enumerator in enumerators)
            yield return enumerator.Current;           
    }
}

使用法:

List<int> list1 = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<int> list2 = new List<int> { 12, 13, 14, 15, 16};
List<int> list3 = new List<int> { 17 };


foreach (int x in EnumerateAll(list1, list2, list3))
    Console.WriteLine(x);

出力

 1 12 17 2 13 3 14 4 15 5 16 6 7 8 9 10

@Rawlingコメントのおかげで、ここに更新されたソリューションがあります

public static IEnumerable<T> EnumerateAll<T>(params IEnumerable<T>[] lists)
{
    var enumerators = lists.Select(l => l.GetEnumerator()).ToList();

    while (enumerators.Any())
    {
        enumerators.RemoveAll(e => !e.MoveNext());

        foreach (var enumerator in enumerators)
            yield return enumerator.Current;
    }
}

1 つのヒント - 要素をインデックスで参照する必要がある場合は、ToList()orを呼び出すだけToArray()です。

var items = EnumerateAll(list1, list2, list3).ToList();
var item = items[5];
于 2013-06-04T12:18:09.083 に答える
0

したがって、アイテムの量(N0、N1 .. Nn)を持つN個のリスト(L0、L1、.. Ln)があり、「マスターインデックス」Kでこの構造から要素を返したい.

K < N の場合、リスト番号 K から要素 [0] を返します (空のリストがない場合)。

K <= N * Min (N0...Nn) の場合、L = K % N 値 (L = 1 の場合は L0、L = 2 の場合は L1) で指定されたリストから要素 [(K - K % N) / N ] を返します。 、あなたの例では L = 0 の L2 )。

K > N * Min (N0...Nn) の場合、短すぎるリストの長さだけ K を減らし、そのようなリストごとに N を 1 減らす必要があります。

そのようなもの、おそらく debuggin を介していくつかの値を調整する必要があります。

于 2013-06-04T11:53:48.357 に答える