从列表中获取元素(如果存在)

本文关键字:如果 存在 元素 列表 获取 | 更新日期: 2023-09-27 18:19:55

我试图从列表中获取两个第一个值,并将它们存储在两个变量中。如果列表包含>=2个值,我应该设置variable1variable2,但如果值列表较短,我应该将null设置为variable1和/或variable2

我现在被这个代码卡住了:

var variable1 = values.Take(1).FirstOrDefault(); // I know it can be just FirstOrDefault()
var variable2 = values.Skip(1).Take(1).FirstOrDefault();

但这看起来有点生气。有更干净的方法吗?类似于:

var variable1 = values.TakeOrDefault(0); //getting first element or default
var variable2 = values.TakeOrDefault(1); //getting second element or default

从列表中获取元素(如果存在)

为什么不创建一个扩展方法?

这只是一个标准的实现,它对可枚举对象进行迭代。如果它击中一个项目两次,就会返回该项目。否则,它将返回默认值。

public static T SecondOrDefault<T>(this IEnumerable<T> list)
{
    IEnumerator<T> i = list.GetEnumerator();
    if (i.MoveNext() && i.MoveNext())
    {
        return i.Current;
    }
    return default(T);
}

或者你更喜欢这种更通用的方法?

public static T NthOrDefault<T>(this IEnumerable<T> list, int n)
{
    IEnumerator<T> i = list.GetEnumerator();
    for (int x = 0; x < n; x++)
    {
        if (!i.MoveNext())
        {
            break;
        }
    }
    return i.Current;
}

如果没有电流,它信任IEnumerable<T>返回default(T),因此不会抛出任何异常。如果你想的话,你总是可以更加保护它。

就在@StepUp回答之后,我发现它实际上可以使用内置函数ElementAtOrDefault来实现,这正是我想要的:

var variable1 = values.ElementAtOrDefault(0); //getting first element or default
var variable2 = values.ElementAtOrDefault(1); //getting second element or default

我知道已经给出了解决方案,但我想展示另一个解决方案。如果你只想从列表中提取前两项,你可以这样做:

int[] someArray = { 0, 1, 2, 3, 4, 5};                
int a,b;
int[] newArray = someArray.Where((e, i) => i <=1).ToArray();
if (newArray.ElementAtOrDefault(0) != null)       
   a = newArray[0];
if(newArray.ElementAtOrDefault(1)!=null)
   b= newArray[1];