繁体   English   中英

迭代数据表时检查列是否存在?

[英]Check if column exists when iterating datatable?

我正在获取一个数据表并将其序列化为 geojson。 我为此使用 linq :

var envelope = new
{
    type = "FeatureCollection",
    features = dataTable.AsEnumerable().Select(record => new {
        type = "Feature",
        properties = new
        {
            Name = Convert.ToString(record["Name"]),
            Date = Convert.ToString(record["Date"]),
            Icon = Convert.ToString(record["imageUrl"]),
            //ReportMonth = Convert.ToString(record["Month"]),
            ReportMonth = (!string.IsNullOrEmpty(record["Month"])) ? Convert.ToString(record["ReportMonth"]) : string.Empty
        },
        geometry = new
        {
            type = "Point",
            coordinates = new[] {
                Convert.ToDecimal(record["Lon"]),
                Convert.ToDecimal(record["Lat"])
            }
        }
    }).ToArray()
};

当数据表包含所有列时,此方法有效。 当数据表中不存在该列时(即列Month ),则迭代失败。

有没有办法检查列是否存在? 我尝试使用三元运算符来检查该值,但显然它不起作用,因为我仍在检查该值是否存在。

如果列不存在/不存在,你想做什么? 抛出错误? 如果是这样,您应该在阅读之前进行验证。 分配默认值? Null 合并。

对于验证,您可以使用您自己的自定义错误包裹在try ... catch和 rethrow 中。

对于 null 合并,类似于:

ReportMonth = Convert.ToString(record["ReportMonth"]?? string.Empty)

您可以使用:

ReportMonth = record.Table.Columns.Contains("Month") 
            ? Convert.ToString(record["Month"])
            : string.Empty;

如果 object 是nullConvert.ToString(object)返回string.Empty ,所以我们不需要检查它。

下面是速度性能优化:

bool hasName = dataTable.Columns.Contains("Name");
bool hasDate = dataTable.Columns.Contains("Date");
bool hasimageUrl = dataTable.Columns.Contains("imageUrl");
bool hasMonth = dataTable.Columns.Contains("Month");
bool hasLon = dataTable.Columns.Contains("Lon");
bool hasLat = dataTable.Columns.Contains("Lat");

var envelope = new
{
  // use: ReportMonth = hasMonth ? ... : ... ;
}

您可以尝试record.Table.Columns.Contains(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM