从列表中获取元素(如果存在)
本文关键字:如果 存在 元素 列表 获取 | 更新日期: 2023-09-27 18:19:55
我试图从列表中获取两个第一个值,并将它们存储在两个变量中。如果列表包含>=2个值,我应该设置variable1
和variable2
,但如果值列表较短,我应该将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];