You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在两个列表中查找元素?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:40:52