如何在两个列表中查找元素?C#列表查询变量初始化问题
解决多列表查找的变量初始化与逻辑问题
首先,你遇到的隐式类型变量必须初始化错误,是因为C#里var要求声明时必须赋值——编译器需要通过初始值推断变量类型。同时你当前的代码逻辑存在矛盾:if (!mylist.Any(...))的判断和后续的查找逻辑完全重复,既没用到第二个列表,也没实现“先查第一个、找不到再查第二个”的需求。
下面是几种符合你要求的实现方式,均只使用一个变量:
方式1:用空合并运算符(推荐)
先在第一个列表查找,若结果为null(元素是引用类型时),则自动去第二个列表查找:
// 假设第二个列表名为secondList var myvar = mylist.Find(item => item.Thing == searchitem) ?? secondList.Find(item => item.Thing == searchitem); mystring = myvar?.Thing; // 加?避免找不到元素时出现null引用异常
如果元素是值类型,改为判断默认值:
var myvar = mylist.Find(item => item.Thing == searchitem); if (myvar == default) { myvar = secondList.Find(item => item.Thing == searchitem); } mystring = myvar.Thing;
方式2:显式声明变量类型
如果你知道元素的具体类型(比如MyItem),可以直接声明类型而非用var,这样就能先声明再赋值:
MyItem myvar; var firstMatch = mylist.Find(item => item.Thing == searchitem); if (firstMatch != null) // 值类型改为判断firstMatch != default { myvar = firstMatch; } else { myvar = secondList.Find(item => item.Thing == searchitem); } mystring = myvar?.Thing;
方式3:合并列表后单次查找
用LINQ的Concat把两个列表合并,再执行一次查找,效果和“先查第一个再查第二个”完全一致:
var myvar = mylist.Concat(secondList).FirstOrDefault(item => item.Thing == searchitem); mystring = myvar?.Thing;
注:FirstOrDefault和Find行为类似,找不到元素时返回默认值(引用类型为null,值类型为default)。
另外,你最初的单列表查找代码可以简化:不用先调用Any再Find,直接用Find的结果判断即可——Find找不到会返回默认值:
var myvar = mylist.Find(item => item.Thing == searchitem); if (myvar != null) // 值类型改为myvar != default { // 处理找到的元素 }
内容的提问来源于stack exchange,提问作者SpaghettiWestern
相关产品推荐
相关产品推荐

