Feedback

C# - List extension methods in .Net

Veröffentlicht von am 11.03.2017
(0 Bewertungen)
List extension methods in .Net
Snippet in VB übersetzen
using System;
using System.Collections.Generic;
using System.Linq;

namespace CollectionExtensions
{
    public static class ListExtension
    {
        public static void AddIfNotExists<T>(this List<T> list, T value)
        {
            CheckListIsNull(list);
            if (!list.Contains(value))
                list.Add(value);
        }

        public static void UpdateValue<T>(this IList<T> list, T value, T newValue)
        {
            CheckListAndValueIsNull(list, value);
            CheckValueIsNull(newValue);
            var index = list.IndexOf(value);
            list[index] = newValue;
        }

        public static void DeleteIfExists<T>(this IList<T> list, T value)
        {
            CheckListAndValueIsNull(list, value);
            if (list.Contains(value))
                list.Remove(value);
        }

        public static bool AreValuesEmpty<T>(this IList<T> list)
        {
            CheckListIsNull(list);
            return list.All(x => x == null);
        }

        private static void CheckListAndValueIsNull<T>(this IList<T> list, T value)
        {
            CheckListIsNull(list);
            CheckValueIsNull(value);
        }

        private static void CheckValueIsNull<T>(T value)
        {
            if (value == null) throw new ArgumentNullException(nameof(value));
        }

        private static void CheckListIsNull<T>(this IList<T> list)
        {
            if (list == null) throw new ArgumentNullException(nameof(list));
        }
    }
}
Abgelegt unter List, extension, methods, method.

2 Kommentare zum Snippet

Koopakiller schrieb am 15.03.2017:
Du hast hier zwar Erweiterungsmethoden für die Schnittstelle IList<T>, von daher gibt es keine festen Implementierungen, aber bei den Standardklassen wie List<T> ist DeleteIfExists nutzlos, da Remove bereits 1 zu 1 genauso arbeitet:
https://msdn.microsoft.com/en-us/library/cd666k3e(v=vs.110).aspx
true if item is successfully removed; otherwise, false. This method also returns false if item was not found in the List<T>.

AreValuesEmpty finde ich ungücklich benannt. Empty ist schließlich nicht null. AreAllValuesNull wäre vielleicht besser geeignet.

Zu UpdateValue: Was ist wenn der Wert der ersetzt werden soll mehrfach vorkommt?
Und was ist wenn man Werte gegen null autauschen möchte bzw. anders herum? Die Prüfung der Values würde ich hier weg lassen.

Statt den mehrfachen Check...IsNull-Methoden würde auch folgendes reichen:
private static void CheckForNull(params object[] objs){
foreach(var obj in objs){
if(obj == null){
throw new ArgumentNullException();
}
}
}

Der fehlende Parametername ist zwar etwas unschön, andererseits ist das deutlich generischer und die Exception ist eigentlich selbsterklärend wenn man den Code sieht. Auch macht es deine CheckValueIsNull-Methode im Moment auch nicht besser. Daher mache ich das Exception werfen meistens direkt in der aufgerufenen Methode ohne Helfer-Methoden.
FranzHuber23 schrieb am 17.03.2017:
"da Remove bereits 1 zu 1 genauso arbeitet:
https://msdn.microsoft.com/en-us/library/cd666k3e(v=vs.110).aspx
--> Bei der Liste ja, beim Dictionary gibt's ne Exception (Ich hab die Methode für Dictionary benutzt und dann einfach auf die Liste adaptiert.

Mit AreValuesEmpty hast du recht, ist unglücklich bennant.

"Zu UpdateValue: Was ist wenn der Wert der ersetzt werden soll mehrfach vorkommt?
Und was ist wenn man Werte gegen null autauschen möchte bzw. anders herum?"
--> Auch damit hast du recht, das hab ich nicht bedacht (Wieder mal die Adaption vom Dictionary, welches ja nur eindeutige Keys erlaubt, auf die Liste)...

Zum CheckIsNull: Ja, kann man auch generisch machen, ich wollte den Parameter drinnen haben.

Ich zerlege generell mittlerweile alles in Mini-Methoden ;) Liegt vielleicht daran, dass ich früher Methoden mit 100 oder mehr Zeilen hatte, die niemand mehr verstanden hat^^
 

Logge dich ein, um hier zu kommentieren!