搜索空白字段时的字符串比较错误

时间:2019-05-13 17:04:30

标签: c# spreadsheet

在电子表格的一列中搜索时,我注意到当第二行遇到空白字段时,它会例外(“可为空的对象必须有一个值。”),但是第一行会成功。我必须将Bool类型转换添加到第二行,因为否则会出现“无法将Nullable 转换为bool”的信息。我认为这是问题所在,但是有没有一种方法可以检查空白字段?

keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => cell.Value?.ToString() == field.Key);
keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => (bool)cell.Value?.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase));

3 个答案:

答案 0 :(得分:1)

这里发生的是,如果?.运算符的左侧为null,则会立即返回null

因此,当cell.Valuenull时,第一行有效,因为您正在使用==运算符进行直接比较,该运算符将返回bool。换句话说,null == field.Key返回false(当然,除非field.Keynull)。

第二行在没有强制转换的情况下不起作用,因为如果值是null,则?.运算符将返回null,其余行将被忽略({{1} }永远不会被调用)。因此,您得到的异常是由于.ToString()条件必须返回if,而实际上却返回了bool

解决此问题的一种方法是先简单地检查Nullable<bool>。这不会比较null处的任何对象:

cell.Value == null

执行此操作的另一种方法是使用keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => cell.Value != null && cell.Value.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase)); 类的静态Equals方法,该方法将允许一个或多个string参数。这将包括null处的结果(对于cell.Value == null也是field.Key的情况将返回true):

null

答案 1 :(得分:1)

在EPPlus和Excel Interop中,如果要对单元格的可见内容进行操作并避免为空,则可以使用Text属性而不是Value属性来读取单元格的内容。 Value返回的object可能为空,但是Text返回的可见文本为string,可以为空,但不能为空。

如果我们使用的是Value.ToString()Value?.ToString(),那么使用Text可能会更好,因为这是我们想要看到的文字而不是价值的赠品。

答案 2 :(得分:0)

也许尝试:

public void ConfigureServices(IServiceCollection services)
        {

            services.AddCors();
            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            //Get the key from configuration file section
            var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);

            //jwt configuration 
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x => {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //Configuration of cors to allow request of anothers 
            app.UseCors(x => x
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());

            //Use the authentication service
            app.UseAuthentication();
            app.UseHttpsRedirection();
            app.UseMvc();
        }