选择中不返回任何内容

时间:2017-12-15 20:06:02

标签: c# linq generics

sooo,星期五晚上,练习的最佳时间:) 我正在努力解决这个问题:

var collection = rows.Skip(skipHeader ? 1 : 0)
    .Select(row =>
    {
        try
        {
            var tnew = new T();
            columns.ForEach(col =>
            {//for simplicity removed some code
                var val = worksheet.Cells[row, col.Column];
                if (col.Property.PropertyType == typeof(double))
                {
                    col.Property.SetValue(tnew, val.GetValue<double>());
                    return;
                }
                col.Property.SetValue(tnew, val.GetValue<string>());
            });

            return tnew;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Could not create object from excel: {e}");
            //return default(T); dont do anything <<=== here i the problem
        }
    }).ToList();

这个想法是这种通用的代码和平从excel连续读取并创建新的T对象。但是,如果有可能行/ excel中有更多数据需要(我不需要的元数据)。 所以基本上我需要检查一切是否顺利。如果它进入异常,那么我知道它不适合模态,所以跳过那一行。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

当返回default(T)时,我得到了正确的对象。 在替补之前,我可以做一个:

.Where(r => !EqualityComparer<T>.Default.Equals(r, default(T)))

以便跳过默认初始化:)

答案 1 :(得分:0)

我建议将逻辑封装在一个单独的函数中:

public bool TryCreate<T>(YourType row, out T result) where T : class
{
    try
    {
        //set result to a properly initialized object
        return true;
    }
    catch(Exception e)
    {
        result = null; // or default(T) and remove constraint
        return false;
    }
}

然后喜欢this answer

var result = rows.Skip(skipHeader ? 1 : 0)
                 .Select(row => new { Success = TryCreateT(row, out var value), value })
                 .Where(pair => pair.Success)
                 .Select(pair => pair.value);

当您评论说您无法返回null时,您可以执行以下两项操作之一:向方法添加class的通用约束或使用default(T)