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

问题描述 投票:4回答:7

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


13
投票

为什么不使用Linq的内置ElementAtOrDefault方法?

string[] names =
    { "Hartono, Tommy", "Adams, Terry", "Andersen, Henriette Thaulow",
        "Hedlund, Magnus", "Ito, Shu" };

int index = 20;

string name = names.ElementAtOrDefault(index);

4
投票

为什么不使用Array

public object GetNamedParametersFrom(GenericObject genericObject)
{
    string[] namesFromLists = new string[genericObject.ListOfThings.Count];

    for (int i = 0; i < genericObject.ListOfThings.Count; i++)
    {
        namesFromLists[i] = genericObject.ListOfThings[i].Name;
    }

    return namesFromLists; //As you are returning an `object`, you can return `resources` array directly from this method
}

0
投票

如果你只是想通过输入要求的resource得到一个index

   if(index < object.Resources.Count){
         resource = object.Resources[index].Name;
    }

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

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

0
投票

我知道这有一个公认的答案,但在我看来,更优雅和简单的解决方案是这样的:

var item = items.Length > n
                ? resourceProperties[n]
                : <default value you want to return if it's out of bounds>;

物品是集合的地方

© www.soinside.com 2019 - 2024. All rights reserved.