Как использовать свойство LongLength для коллекций в .Net [duplicate]

// (IE9+) Two steps

var pathString = "[0]['property'].others[3].next['final']";
var obj = [{
  property: {
    others: [1, 2, 3, {
      next: {
        final: "SUCCESS"
      }
    }]
  }
}];

// Turn string to path array
var pathArray = pathString
    .replace(/\[["']?([\w]+)["']?\]/g,".$1")
    .split(".")
    .splice(1);

// Add object prototype method
Object.prototype.path = function (path) {
  try {
    return [this].concat(path).reduce(function (f, l) {
      return f[l];
    });
  } catch (e) {
    console.error(e);
  }
};

// usage
console.log(obj.path(pathArray));
console.log(obj.path([0,"doesNotExist"]));

4
задан Kibbee 2 December 2008 в 03:38
поделиться

4 ответа

Плюс он возвращает общее количество элементов во всех измерениях массива, поэтому он может быть массивом с «всего лишь» полумиллиардом элементов и 4 измерениями, чтобы сделать его необходимым 64-битным int.

2
ответ дан Stefan 28 August 2018 в 08:04
поделиться
  • 1
    Разве это еще не 2 миллиарда элементов? – Kibbee 2 December 2008 в 04:25
  • 2
    Да, конечно, я имею в виду, что если вы думаете, почему кто-то хочет обрабатывать 2 миллиарда элементов & quot; это может показаться более разумным, если бы было всего полтора миллиарда элементов, но с некоторыми атташевыми свойствами в связанных измерениях. – Stefan 2 December 2008 в 04:40
  • 3
    почему, если документация совершенно неверна, Array.Length также «получает общее количество элементов во всех измерениях массива». – dlatikay 8 December 2017 в 13:05

Например, если у вас есть файл размером> 2 ГБ и вам необходимо сразу прочитать все это в памяти, это вызовет такой массив. Не то, что это всегда рекомендуется в большинстве случаев, но вполне может быть какой-то случай (на достаточно мощной 64-разрядной системе с большой памятью), что это может потребоваться (возможно, по соображениям производительности?).

Редактирование: Конечно, следует отметить, что с CLR 2.0 наличие массива> 2 ГБ на самом деле не поддерживается (вся реализация LongLength делает линией длину длинной и пытается создать большой массив не удастся) ... но, возможно, Microsoft планирует добавить поддержку позже ...?

5
ответ дан Eric Rosenberger 28 August 2018 в 08:04
поделиться

Очень возможно иметь массив с более чем 2 миллиардами записей в 64-битном сценарии. LongLength действительно предназначен для поддержки таких сценариев.

Что касается того, действительно ли это используется. Я могу с уверенностью сказать, что есть какой-то клиент, где-то, который считает это жизненно важной задачей бизнеса. Клиенты находят применение для функций, которые вы никогда не считали возможными.

1
ответ дан JaredPar 28 August 2018 в 08:04
поделиться

Существует школа мысли, известная как школа «0, 1 или N», которая полагает, что вам ничто не должно быть; одно из чего-то; или любой номер чего-либо, как позволяют ресурсы.

Другими словами, не устанавливайте произвольные пределы, если вам это не нужно. Произвольные лимиты дали нам такие чудовища, как:

  • ограничение 640K на ранних ПК.
  • уязвимости переполнения буфера.
  • отвратительная схема адресации CHS .

Имейте в виду, что даже два миллиарда 64-битных целых числа занимают только

            17,179,869,184 bytes of the
18,446,744,073,709,551,616 bytes of 64-bit address space available.

. Это меньше 1 тысячи миллионных или 10-9 или вы могли бы много миллионов этих массивных массивов до истечения адресного пространства.

5
ответ дан paxdiablo 28 August 2018 в 08:04
поделиться
  • 1
    Также известен как 1 миллиард ... – TraumaPony 2 December 2008 в 06:08
  • 2
    Да, я подумал об этом, но я не могу вспомнить, существует ли расхождение между американским и европейским миллиардами (один из них 10 ^ 9, а другой - 10 ^ 12). Я не мог побеспокоить его, поэтому я взял безопасный вариант. – paxdiablo 2 December 2008 в 06:54
Другие вопросы по тегам:

Похожие вопросы: