从自定义 class 对象列表中获取那些元素,这些对象的一个​​ 属性 值可解析为 double

Get those elements from a List of custom class objects whose one property value is parseable to double

我在 C# 中有一个自定义 class 对象列表,其 class 结构如下:

public class ABC
{
   int ID;
   string Text1;
   string Text2;
}

这个列表存储这样的数据:

+-----+-------+--------+
| ID  | Text1 |  Text2 |
+----------------------+
| 1   | PQR   |  test1 |
|     |       |        |
| 2   | XYZ   |  12.69 |
+-----+-------+--------+

我正在尝试获取具有不同 ID 的行,如下所示:

ABCObject = ABCObject.GroupBy(c => c.ID).Select(c => c.First()).ToList();

一切正常。但是,我想添加另一个条件,即 ABCObject 应该只包含那些具有 double 数据的行。在上面给定的情况下,它是 ID = 2 的行。那么,是否可以在 LINQ 中执行此操作?或者我必须创建另一个函数,它将 运行 一个 foreach 循环并使用 double.TryParse()?

测试每个元素

您可以在 LINQ 中使用 double.TryParse,尽管不可否认 out 参数很烦人:

ABCObject = ABCObject
    .Where(x => { double ignored; return double.TryParse(x => x.Text2, out ignored); }
    .GroupBy(c => c.ID)
    .Select(c => c.First())
    .ToList();

您可以使用您自己的可重用方法使此更清洁,该方法使用可空类型而不是 bool+out 到 return 结果:

private static double? NullableTryParseDouble(string text)
{
    double result;
    return double.TryParse(text, out result) ? result : default(double?);
}

然后:

ABCObject = ABCObject
    .Where(x => NullableTryParseDouble(x.Text2) != null)
    .GroupBy(c => c.ID)
    .Select(c => c.First())
    .ToList();