Удалите 3 самых старых элемента из Списка <> в C#

Пространства имен являются пакетами по существу. Они могут использоваться как это:

namespace MyNamespace
{
  class MyClass
  {
  };
}

Тогда в коде:

MyNamespace::MyClass* pClass = new MyNamespace::MyClass();

Hope, которая помогает.

Или, если Вы хотите всегда использовать определенное пространство имен, можно сделать это:

using namespace MyNamespace;

MyClass* pClass = new MyClass();

Редактирование: После того, что сказал bernhardrusch, я склонен не использовать "синтаксис" пространства имен x использования вообще, я обычно явно определяю пространство имен при инстанцировании моих объектов (т.е. первый пример, который я показал).

И поскольку Вы спросили ниже , можно использовать столько пространств имен, сколько Вам нравится.

5
задан David 8 November 2009 в 07:34
поделиться

5 ответов

Если вам нужно только перечислить элементы , это будет работать:

stuff.OrderBy(item => item.Date).Skip(3);

Если вы действительно хотите, чтобы это было в форме списка, вам нужно будет затем вызвать .ToList () :

stuff = stuff.OrderBy(item => item.Date).Skip(3).ToList();
8
ответ дан 18 December 2019 в 09:50
поделиться

Если вы хотите заменить список новым, вы можете попробовать следующее:

stuff = stuff.OrderBy( c => c.Date).Skip(3).ToList();

С другой стороны, если вам нужно материал , чтобы остаться такой же точный экземпляр List , вы можете отсортировать его, а затем удалить диапазон по индексу:

stuff.Sort(...);
stuff.RemoveRange(0, 3);
4
ответ дан 18 December 2019 в 09:50
поделиться
const int cToRemove = 3;

var top3 = (from c in stuff
        orderby c.Date ascending
        select c).Take(cToRemove);
1
ответ дан 18 December 2019 в 09:50
поделиться

Если ваш список упорядочен, вы можете просто использовать метод RemoveRange :

int n = 3;
stuff.RemoveRange(stuff.Count - n, n);
3
ответ дан 18 December 2019 в 09:50
поделиться

Все остальные ответы до сих пор основывались на сортировке списка, которая является операцией O (n log n), если вы еще не отсортировали ее.

Вот решение, которое это O (n), хотя и с ужасным постоянным множителем. Он использует MinBy из MoreLINQ - вы можете легко переписать это в своем собственном коде, если вам нужно, и даже заставить его возвращать индекс напрямую вместо значения (и использовать RemoveAt вместо Remove ).

// The list.Count part is in case the list starts off with
// fewer than 3 elements
for (int i = 0; i < 3 && list.Count > 0; i++)
{
    var oldest = list.MinBy(x => x.Date);
    list.Remove(oldest);
}

Конечно, вы могли бы написать это более эффективно, чтобы находить самые старые три элемента за один проход списка, но код будет значительно сложнее, что приведет к больше шансов на ошибку. Вышеупомянутое должно нормально работать в O (n), даже если ему не хватает элегантности, когда вы думаете о том, что он просматривает список 6 раз :)

1
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

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