1

シーケンス内の要素をグループ化するためのアルゴリズムを探しています。
例:
次のリストがあります。

1 2 3 4 5 11 11 12 13 3 5 6 11 22 12 24 5 6 22 33

値が 10 より大きい項目が 3 つ以上あるすべてのシーケンスを検索したいと考えています。

だから私は得るでしょう:

11 11 12 13

11 22 12 24

Linq クエリで実行できますか? それを行う最良の方法は何ですか?

4

4 に答える 4

4

これが機能する私のLinqPadバージョンです。これが欲しいかどうかわからない:-)

void Main() {
    var data = new int[] { 1, 2, 3, 4, 5, 11, 11, 12, 13, 3, 5, 6, 11, 22, 12, 24, 5, 6, 22, 33 };
    var t = 10;  // threshold
    var m = 3;   // max-in-group
    var result = Enumerable.Range(0, data.Length)
        .Select(x => new { 
            // the sequence
            d = data.Skip(x).TakeWhile(y => y > t).ToList(),
            // an indicator is the previous was empty
            // we need this to remove unwanted sequences
            p = x > 0 ? !data.Skip(x - 1).TakeWhile(y => y > t).Any() : true 
        })
        .Where(x => x.p && x.d.Count() > m)
        .Select(x => x.d);
    // LinqPad method to show the value of variable result.
    result.Dump();
}
于 2013-05-27T13:24:23.807 に答える
2

結果を得るには前後の項目に関する情報が必要なため、LINQ はここでは最適なオプションではありません。単純なループを実装するのが最も簡単な方法です。

var result = new List<List<int>>();

var sequence = new List<int>();
foreach(var item in original)
{
    if(item <= 10)
    {
        if(sequence.Count > 3)
            result.Add(sequence);
        sequence = new List<int>();
    }
    else
        sequence.Add(item);
}

if(sequence.Count > 3)
    result.Add(sequence);
于 2013-05-27T13:21:13.153 に答える
1

ここでは LINQ の使用が強制されているようです。を使用した解決策を次に示しforeachます。各要素に 1 回だけアクセスします。

var list = new[] { 1, 2, 3, 4, 5, 11, 11, 12, 13, 3, 5, 6, 11, 22, 12, 24, 5, 6, 22, 33 };

var cur = new List<int>();
var result = new List<List<int>>();
foreach (var ele in list)
{
    if (ele > 10)
        cur.Add(ele); // Add to current sequence
    else
    {
        if (cur.Count > 3)
            result.Add(cur); // Current sequence is valid
        cur = new List<int>(); // Start new sequence
    }
}
if (cur.Count > 3)
    result.Add(cur); // Final sequence is valid
于 2013-05-27T13:55:06.000 に答える