LINQ运算符将基于通用分隔符的双精度列表拆分为多个双精度列表

时间:2012-11-02 12:05:04

标签: c# linq

我有一个List个double值,其中一些元素是NaN。我想转换这个列表 使用NaN作为分隔符进入多个双精度列表。 例如:

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 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:3)

List<List<double>> result = values.GroupDelimited(x => x == double.NaN)
                                  .Select(g => g.ToList())
                                  .ToList();

使用here中的 GroupDelimited扩展方法

答案 2 :(得分:2)

如果您有两个double.NaN值,或者在输入的开头或结尾有一个值,则会包含空列表:

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);

答案 3 :(得分: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));
}