我正在尝试从列表中获取2个第一个值并将它们存储在两个变量中。如果列表包含> = 2个值,我应该设置variable1
和variable2
,但如果值列表更短,我应该null
为variable1
和/或{{1} }。
我现在坚持使用这段代码:
variable2
但这看起来有点哈哈。有没有更清洁的方法来获得它?类似的东西:
var variable1 = values.Take(1).FirstOrDefault(); // I know it can be just FirstOrDefault()
var variable2 = values.Skip(1).Take(1).FirstOrDefault();
答案 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