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




