我正在寻找最优雅的解决方案,以便在请求的索引不受限制时从object[]
获取值。
我目前的解决方案如下:
public object GetNamedParametersFrom(GenericObject genericObject)
{
string nameFromListOne = String.Empty;
string nameFromListTwo = String.Empty;
for (int i = 0; i < genericObject.ListOfThings.Count; i++)
{
switch (i)
{
case 0:
nameFromListOne = genericObject.ListOfThings[i].Name;
break;
case 1:
nameFromListTwo = genericObject.ListOfThings[i].Name;
break;
}
}
return new {
nameFromListOne,
nameFromListTwo
}
}
答案 0 :(得分:11)
为什么不使用Linq的内置ElementAtOrDefault方法?
string[] names =
{ "Hartono, Tommy", "Adams, Terry", "Andersen, Henriette Thaulow",
"Hedlund, Magnus", "Ito, Shu" };
int index = 20;
string name = names.ElementAtOrDefault(index);
答案 1 :(得分:4)
为什么不使用df = df[df.index != 'n/a']
?
df = df[df['your_column_name'] != 'n/a']
答案 2 :(得分:3)
扩展方法怎么样:
public static TValue GetSafe<TItem, TValue>(this IList<TItem> list,
int index, Func<TItem, TValue> selector, TValue defaultValue)
{
// other checks omitted
if (index < 0 || index >= list.Count)
{
return defaultValue;
}
return selector(list[index]);
}
你可以使用它,然后像:
var items = new[] {"Hello", "World", "!"};
var value0 = items.GetSafe(0, s => s.Length, 0);
var value1 = items.GetSafe(1, s => s.Length, 0);
var value2 = items.GetSafe(2, s => s.Length, 0);
var value3 = items.GetSafe(3, s => s.Length, 0);
最后一行不会引发错误,value3
将设置为0
(defaultValue
)。
答案 3 :(得分:0)
如果您只想输入一个resource
,请输入所请求的index
if(index < object.Resources.Count){
resource = object.Resources[index].Name;
}
答案 4 :(得分:0)
使用扩展方法
public T TryGetElement<T>(this T[] array, int index, T defaultElement) {
if ( index < array.Length ) {
return array[index];
}
return defaultElement;
}
像这样使用
// Select name to a string[]
var names = @object.Resources.Select(i => i.Name).ToArray();
resourceOne = names.TryGetElement(0, null);
resourceTwo = names.TryGetElement(1, null);
答案 5 :(得分:0)
public T ElementOrDefault<T>(this T[] array, int index, T defaultElement) {
if ( index < array.GetLowerBound(0) || index > array.GetUpperBound(0) ) {
return defaultElement;
}
return array[index];
}