Feedback

C# - LINQ-Erweiterung für eindeutige Liste

Veröffentlicht von am 12/5/2008
(3 Bewertungen)
Diese Erweiterung nimmt eine Liste und ermittelt aus dieser durch Übergabe eines Schlüssels eine Liste mit eindeutigen Werten.

Beispiel:

class Program
{
static void Main()
{
List<Person> personList = new List<Person>
{
new Person{Name = "Gü"},
new Person{Name = "Andrea"},
new Person{Name = "Gü"}
};

List<Person> myUniqueList = personList.Unique(i => i.Name);
}
}

public class Person
{
public string Name { get; set; }
}

Im Ergebnis werden nur eindeutige Werte in Bezug auf den Namen zurückgegeben.
using System;
using System.Collections.Generic;
using System.Linq;

namespace gfoidl.Linq
{
	public static class LinqExtensions
	{
		public static List<T> Unique<K, T>(this List<T> inputList, Func<T, K> func)
		{
			#region Input validation
			if (func == null)
				throw new ArgumentNullException("Key selector function cannot be null");

			if (inputList == null)
				return null;

			if (inputList.Count == 0)
				return new List<T>();
			#endregion

			var grp = inputList.GroupBy(func);
			return grp.Select(g => g.First()).ToList();
		}
	}
}

6 Kommentare zum Snippet

Günther Foidl schrieb am 12/6/2008:
Bei einer Bewertung mit 1 wäre die Angabe einer Begründung hilfreich. Oder hat das mit mir zu tun?
Jan Welker schrieb am 12/6/2008:
Ich denke auch, dass eine Begründung angebracht wäre.
Ich finde die schlechte Bewertung nicht gerechtfertigt.
Rainer Hilmer schrieb am 12/6/2008:
Vielleicht kommt die schlechte Bewertung auch durch das fehlerhafte Demo, was ich aber auch für ungerechtfertigt halte. Ich hab's mal korrigiert und um die Ausgabe von myUniqueList erweitert:
class Program
{
static void Main()
{
List<Person> fooList = new List<Person>
{
new Person { Name = "Günther" },
new Person { Name = "Andrea" },
new Person { Name = "Günther" }
};
List<Person> myUniqueList = fooList.Unique(i => i.Name);
foreach (var person in myUniqueList)
{
Console.WriteLine(person.Name);
}

// Verhindert das selbsttätige Schließen des Konsolenfensters.
Console.WriteLine("\nPress any key to terminate the program.");
Console.ReadKey();
}
}

class Person
{
public string Name { get; set; }
}
Rainer Hilmer schrieb am 12/6/2008:
AHA! Spitze Klammern werden hier verschluckt. Dann war dein Demo nicht fehlerhaft, Günther. Ich möchte mich entschuldigen.
Günther Foidl schrieb am 12/6/2008:
Danke Rainer!
Hab das Beispiel jetzt selbst HTML-Encoded (&lt; und &gt;).
hackman schrieb am 11/15/2010:
schon mal die Funktion IEnumerable - Distinct() gesehen?
 

Logge dich ein, um hier zu kommentieren!