1

この形式の文字列配列があります (各行は配列のスロットです):

IT1
PID リファレンス リファレンス リファレンス
IT1 PID リファレンス
IT1 PID リファレンス リファレンス ...








LINQ を使用して、最後の REF から各 IT1 を新しい配列に抽出したいと考えています。新しい結果はIEnumerable<IEnumerable<string>>.

上記の文字列スロット配列の例を使用すると、新しい IEnumerable コレクションには 3が含まIEnumerable<string>れているはずです。

例えば:

クラス 1
IT1
PID
Ref
Ref
REF
エンド クラス 1

クラス 2
IT1
PID
REF
エンド クラス 2

クラス 3
IT1
PID
Ref
REF
エンド クラス 3
...

配列のいくつかのセクションには 1 つの REF、いくつかの 2 つの REF、およびいくつかの REF があることに注意してください。

LINQ を使用して、IT1 から最後の REF までの各セクションを の新しいコレクションに抽出するにはどうすればよいIEnumerable<IEnumerable<string>>ですか?

擬似コード...

var result = arrayData.Select(s => s.StartsWith("IT1")
.GroupBy(...)
.Select(result => new {IT1 through last ref goes here})
.ToArray();

助けてくれてありがとう!

4

2 に答える 2

3

GroupBy次のような一時的な状態を使用して、配列を分割できます。

var counter = 0;
var arrays = input.GroupBy(s => counter += s == "IT1" ? 1 : 0)
                  .Select(g => g.ToArray())
                  .ToArray();

これにより、配列の配列が得られます。"IT1"各サブ配列は要素で始まり、次の前に入力したもので終わります"IT1"。データが有効な場合、それはになります"REF"。データが無効な場合は、この場合に何が起こるかを指定する必要があります。

ただし、これらの配列が匿名オブジェクトに変換されることをどのように期待するかはわかりません。匿名オブジェクトのタイプ名は不明である可能性がありますが、それでも非常に強く型付けされています。メンバーの数、名前、およびタイプを動的に決定することはできません。

于 2012-10-02T14:21:34.530 に答える
0
public static IEnumerable<IEnumerable<string>> Partitian(IEnumerable<string> source)
{
    List<string> buffer = new List<string>();
    int? lastRef = null;

    int position = 0;
    foreach (string s in source)
    {
        if (s == "REF")
            lastRef = position;
        else if (s == "IT1" && lastRef.HasValue)
        {
            yield return buffer.Take(lastRef.Value + 1);
            buffer.Clear();
            position = 0;
            lastRef = null;
        }
        buffer.Add(s);

        position++;
    }

    if (buffer.Any() && lastRef.HasValue)
        yield return buffer;
}
于 2012-10-02T14:28:04.333 に答える