从自定义类对象的列表中获取这些元素,这些对象的一个属性值可解析为双精度
本文关键字:对象 属性 一个 双精度 列表 自定义 获取 元素 | 更新日期: 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();