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

Ais*_*iva 2 .net c# linq collections list

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

public class ABC
{
   int ID;
   string Text1;
   string Text2;
}
Run Code Online (Sandbox Code Playgroud)

此列表存储如下数据:

+-----+-------+--------+
| ID  | Text1 |  Text2 |
+----------------------+
| 1   | PQR   |  test1 |
|     |       |        |
| 2   | XYZ   |  12.69 |
+-----+-------+--------+
Run Code Online (Sandbox Code Playgroud)

我试图得到ID像这样明显的行:

ABCObject = ABCObject.GroupBy(c => c.ID).Select(c => c.First()).ToList();
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 6

你可以double.TryParse在LINQ 中使用,虽然不可否认这个out参数很烦人:

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

您可以使用自己的可重用方法使用可空类型而不是bool + out来返回结果:

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

然后:

ABCObject = ABCObject
    .Where(x => NullableTryParseDouble(x.Text2) != null)
    .GroupBy(c => c.ID)
    .Select(c => c.First())
    .ToList();
Run Code Online (Sandbox Code Playgroud)