从自定义类对象的列表中获取这些元素,这些对象的一个属性值可解析为双精度

本文关键字:对象 属性 一个 双精度 列表 自定义 获取 元素 | 更新日期: 2023-09-27 17:55:35

我有一个 C# 中的自定义类对象列表,其类结构如下所示:

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 来返回结果:

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