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

时间:2015-10-29 12:23:07

标签: c# linq

我正在尝试从列表中获取2个第一个值并将它们存储在两个变量中。如果列表包含> = 2个值,我应该设置variable1variable2,但如果值列表更短,我应该nullvariable1和/或{{1} }。

我现在坚持使用这段代码:

variable2

但这看起来有点哈哈。有没有更清洁的方法来获得它?类似的东西:

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

3 个答案:

答案 0 :(得分:2)

为什么不创建扩展方法?

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

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),因此它不会抛出任何异常。如果你愿意,你可以随时保护它。

答案 1 :(得分:1)

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

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];

答案 2 :(得分:1)

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

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