Основным преимуществом является то, что массивы загружаются лениво. То есть, если у вас есть файл npz
с 100 массивами, вы можете загрузить файл без фактической загрузки каких-либо данных. Если вы запрашиваете один массив, загружаются только данные для этого массива.
Недостатком файлов npz
является то, что они не могут отображаться в памяти (используя load(
), поэтому для больших массивов они могут быть не лучшим выбором. Для данных, где массивы имеют общую форму, я бы посоветовал взглянуть на структурированные массивы . Они могут быть отображены в память, разрешать доступ к данным с помощью dict-подобного синтаксиса (то есть, arr['field']
) и очень эффективны в отношении памяти.
С точки зрения эффективности, да, TryParse обычно является предпочтительным маршрутом.
Если Вы можете знать (например, отражением) целевой тип заранее - но не хотите должными быть использовать большое switch
блок, Вы могли бы интересоваться использованием TypeConverter
- например:
DateTime foo = new DateTime(2008, 11, 20);
TypeConverter converter = TypeDescriptor.GetConverter(foo);
string s = converter.ConvertToInvariantString(foo);
object val = converter.ConvertFromInvariantString(s);
Я рекомендовал бы.TryParse () лично. Это - то, что я использую во всяком случае. Это - то, если Ваши данные будут неправильными время от времени. Если Вы уверены, что входящие строки смогут преобразовать в целые числа или удваиваются без помехи.Parse () быстрее.
Вот интересная ссылка для поддержки этого.
Int.TryParse
и Double.TryParse
обладайте преимуществом фактического возврата числа.
Что-то как Regex.IsMatch("^\d+$")
имеет недостаток, что все еще необходимо проанализировать строку снова для вывода значения.
Сохраняя идею преобразователя пропустить блок переключателя, Вы могли использовать понятие Утиного Ввода. В основном Вы хотите повернуть строку к X, таким образом, Вы делаете метод, который назовет X.TryParse (строка, X x), если X будет иметь TryParse на нем, иначе Вы просто не беспокоитесь (Или я предполагаю, что Вы могли бросить ошибку). Как Вы сделали бы это? Отражение и Дженерики.
В основном у Вас был бы метод, который будет брать в типе и использовать отражение, чтобы видеть, имеет ли оно TryParse на нем. При нахождении такого метода, Вы затем называете его и возвращаетесь, любому TryParse удалось добраться. Это работает хорошо с примерно любым типом значения, любят, говорят Десятичное число или DateTime.
public static class ConvertFromString
{
public static T? ConvertTo<T>(this String numberToConvert) where T : struct
{
T? returnValue = null;
MethodInfo neededInfo = GetCorrectMethodInfo(typeof(T));
if (neededInfo != null && !numberToConvert.IsNullOrEmpty())
{
T output = default(T);
object[] paramsArray = new object[2] { numberToConvert, output };
returnValue = new T();
object returnedValue = neededInfo.Invoke(returnValue.Value, paramsArray);
if (returnedValue is Boolean && (Boolean)returnedValue)
{
returnValue = (T)paramsArray[1];
}
else
{
returnValue = null;
}
}
return returnValue;
}
}
Где GetCorrectMethodInfo выглядел бы примерно так:
private static MethodInfo GetCorrectMethodInfo(Type typeToCheck)
{
MethodInfo returnValue = someCache.Get(typeToCheck.FullName);
if(returnValue == null)
{
Type[] paramTypes = new Type[2] { typeof(string), typeToCheck.MakeByRefType() };
returnValue = typeToCheck.GetMethod("TryParse", paramTypes);
if (returnValue != null)
{
CurrentCache.Add(typeToCheck.FullName, returnValue);
}
}
return returnValue;
}
И использование было бы:
decimal? converted = someString.ConvertTo<decimal>();
Я очень не хочу включить меня, но мне объяснили это полностью здесь: