You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#列表查找:如何优先获取非指定值的非空首元素

用List.Find实现自定义优先级的非空元素查找

嘿,这个需求完全可以通过调整Find方法的逻辑来实现,咱们把需求拆解开,一步步搞定:

核心规则梳理

你需要的逻辑其实分两种场景:

  • field1等于"abc"时:优先找列表中第一个不是"abc"且非空的元素;如果其余元素全为空,再退而求其次取field1
  • field1不等于"abc"时:保持原有逻辑,直接找第一个非空元素

实现代码

我们可以分情况处理,让逻辑更清晰易懂:

// 先把所有字段放进列表
var fields = new List<string> { field1, field2, field3, field4 };
string targetField;

if (field1 == "abc")
{
    // 优先查找第一个非空且不是"abc"的元素
    targetField = fields.Find(x => !string.IsNullOrEmpty(x) && x != "abc");
    
    // 如果找不到符合条件的元素,就取field1
    if (targetField == null)
    {
        targetField = field1;
    }
}
else
{
    // 原有逻辑:找第一个非空元素
    targetField = fields.Find(x => !string.IsNullOrEmpty(x));
}

验证场景

  • field1="abc"field2="def"时:Find会匹配到field2,直接返回"def",符合你的优先要求
  • field1="abc"field2/field3/field4全为空时:Find返回null,随后赋值为field1(即"abc"
  • field1="xyz"field2为空时:直接返回"xyz",保持原有逻辑的正确性

可选的极简写法(整合到单个Find)

如果你想把逻辑塞进一个Find调用里,也可以用下面的方式(可读性稍弱,适合追求代码简洁的场景):

var fields = new List<string> { field1, field2, field3, field4 };
string targetField = fields.Find(x => 
    (field1 != "abc" && !string.IsNullOrEmpty(x)) ||
    (field1 == "abc" && (!string.IsNullOrEmpty(x) && x != "abc"))
) ?? (field1 == "abc" ? field1 : null);

这个写法用空合并运算符??处理了“找不到符合条件元素时取field1”的场景,但分情况的写法更直观,维护起来更方便。

内容的提问来源于stack exchange,提问作者marko

火山引擎 最新活动