Loading...
Iv_Konov avatar Iv_Konov 383 Точки

C# - Insert и RemoveAt действия с List - не много смислени занимавки :)

Здравейте, 

 

Намерих едно удобство с List<T>.Insert(Int32, T) Method. Може и да е съвсем ясно за някои...

От по-долните постове стана ясно, че това което съм си "открил" няма практическа полза, освен при някои задачи в модула, но дори и при тези задачи не е толкова голяма ползата, т.е. явно съм се занимавал с глупости.... laugh


C# ползволява да допълните елемент с метода .Insert(Int32, T) дори и като последен, т.е. index може да е равно на List<T>.Count! С други думи да допълните/вмъкнете елемент след текущия последен.
" index is greater than Count"  - позволява се index = List<T>.Count.

 

Това е от документацията:
"Exceptions
ArgumentOutOfRangeException
index is less than 0.
-or-
index is greater than Count."


Практическото удобство, е че може да се ползва при нужда от заместване на елемент в колекция. Ползволява да допълним друг елемент на мястото на изтрития с .Insert(), без да извършваме проверка дали да ползваме .Add() или .Insert()! Разбира се, .Insert() не елиминира удобството на .Add() в други случи...

 

Примерен код:

            List<string> list = Console.ReadLine().Split().ToList();
            int index = int.Parse(Console.ReadLine());

            list.RemoveAt(index);
            list.Insert(index, "addedElement");

            Console.WriteLine(string.Join(" ", list));


 

Примерен вход:

===

1 2 3 4 5
4

===



Резултат: 

1 2 3 4 addedElement

 

Това са спестените проверки - if-else:


            List<string> list = Console.ReadLine().Split().ToList();
            int index = int.Parse(Console.ReadLine());

            list.RemoveAt(index);
            //list.Insert(index, "addedElement");

            if (index == list.Count)
            {
                list.Add("addedElement");
            }
            else
            {
                list.Insert(index, "addedElement");
            }

            Console.WriteLine(string.Join(" ", list));

 

Поздрави,

Иван

 

P.S. Коригирах текста предвид обратната връзка на опитни колеги!

Тагове:
0
Fundamentals Module 17/06/2019 21:31:48
VasilKotsev avatar VasilKotsev 830 Точки

Не бих го нарекъл практическо удобство, защото при Insert трябва да се пренареди цялата колекция при добавяне на елемент. За мен лично по-КПК е да си опиша проверките в метод/фукнция. Операции от тип премахване, добавяне на елемент на конкретен индекс са бавни, особено при колекции с много елементи. Лично аз избягвам да трия/инсъртвам в колекции когато е възможно. Ако толкова искаш да заместиш елемент просто го достъпваш през индексатора.

Ето ти един бенчмарк, който набързо написах, при лист от  100000000 елемента:

Разликата е огромна за добавянето на един елемент...

namespace SandBox
{
    using System;
    using System.Diagnostics;
    using System.Linq;

    public class EntryPoint
    {
        public static void Main()
        {   
            var fooList = Enumerable.Range(0, 100_000_000).ToList();
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            fooList.Insert(fooList.Count, 999);
            stopwatch.Stop();
            Console.WriteLine($"Insert() at last index elapsed time: {stopwatch.Elapsed}");

            fooList.RemoveAt(fooList.Count - 1);

            stopwatch.Reset();
            stopwatch.Start();
            fooList.Add(999);
            stopwatch.Stop();
            Console.WriteLine($"Add() elapsed time: {stopwatch.Elapsed}");
        }
    }
}

 

1
Iv_Konov avatar Iv_Konov 383 Точки

Здравей,

 

Напълно си прав - нужно е да се следи практичността и целесъобразността на дадени методи особено при големи структури от данни.

Аз по-скоро визирах удобството при решаване на задачи от домашни/тестове/изпити. Точно такива действия фигурират в редица задачи от този модул (Fundamentals Module). 

 

Поздрави,

Иван :)

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

общо взето глупости....

колегата то го е казал.. Не се учете на глупости отсега. вярно Np bigО не ви говорят нищо но не е добра практика, не се опитвайте да откриете топлата вода там където хората от години развиват нещата.Има си причини някои неща да не се правят макар че съществуват.

0
Iv_Konov avatar Iv_Konov 383 Точки

Ивайло Кенов ни каза да не обръщаме внимание (поне на този етап) на тези детайли... стига да не прескачаме времевия лимит на Съдията. smiley

После, ако не го бях написал, нямаше да ми нашокате канчето - в крайна сметка нали за това е този форум. Разбира се, коригирих текста на заглавието и първия пост, за да не заблуждавам някой в "полезността".

 

Поздрави,

Иван 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.