1

List一部の要素が NaN である double 値があります。NaN を区切り文字として使用して、このリストを double の複数のリストに変換したいと考えています。例:

List<double> values =  new List<double>        
   { 1.2, 2.2, 3.2, Double.NaN, 2.2, 2.3, Double.NaN, 4.1, 4.2, 4.3 }; 
List<List<double>> result = values.SomeLinqOperator....
4

4 に答える 4

4

何も組み込まれていませんが、次のように記述できます。

public static IEnumerable<List<T>> SplitBy<T>(
    this IEnumerable<T> source, T delimiter)
{
    List<T> buffer = new List<T>();
    var comparer = EqualityComparer<T>.Default;
    foreach (var item in source)
    {
        if (comparer.Equals(item, delimiter))
        {
            yield return buffer;
            buffer = new List<T>();
        }
        else
        {
            buffer.Add(item);
        }
    }
    yield return buffer;
}
static void Main()
{
    List<double> values = new List<double> 
        {1.2,2.2,3.2,double.NaN,2.2,2.3,double.NaN,4.1,4.2,4.3 };
    List<List<double>> result = values.SplitBy(double.NaN).ToList();
}
于 2012-11-02T12:09:59.670 に答える
3
List<List<double>> result = values.GroupDelimited(x => x == double.NaN)
                                  .Select(g => g.ToList())
                                  .ToList();

ここからGroupDelimited 拡張メソッドを使用します。

于 2012-11-02T12:07:55.133 に答える
2

double.NaN2 つの値が一緒にある場合、または入力の最初または最後に 1つの値がある場合、これには空のリストが含まれます。

List<List<double>> result = new List<List<double>>();
List<double> current = new List<double>();
foreach (double d in values)
{
    if (d == double.NaN)
    {
        result.Add(current);
        current = new List<double>();
    }
    else
    {
        current.Add(d);
    }
}
result.Add(current);
于 2012-11-02T12:08:21.777 に答える
0

これはもっと簡単なものです(私は思います)。

public static IEnumerable<IEnumerable<T>> SplitBy<T>(this IEnumerable<T> source, T delimiter)
{
    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    for (IEnumerable<T> s = source; s.Any(); s = s.SkipWhile(s2 => !comparer.Equals(s2, delimiter)).Skip(1))
        yield return s.TakeWhile(s2 => !comparer.Equals(s2, delimiter));
}
于 2012-11-02T13:20:11.420 に答える