如果不超出范围,从数组中获取值

时间:2015-05-20 06:25:23

标签: c# arrays

我正在寻找最优雅的解决方案,以便在请求的索引不受限制时从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
        }
    }

6 个答案:

答案 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将设置为0defaultValue)。

答案 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];
}