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()?
你可以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)