C# Räkna antal förekomster av objekt

Permalänk
Medlem

C# Räkna antal förekomster av objekt

Nu är det alldeles för sent för mig, men tänkte se om någon kanske kan hjälpa mig.

Jag vill kunna räkna antal förekomster av de olika objekten som är med i listan items. I detta fallet vill jag få svaret 3st Item och 2st Item2.

namespace Test { class Test { List<Item> items = new List<Item>(); public test() { items.Add(new Item()); items.Add(new Item()); items.Add(new Item()); items.Add(new Item2()); items.Add(new Item2()); // VAD HÄR DÅ? } } class Item { } class Item2 : Item { } }

Permalänk

http://msdn.microsoft.com/en-us/library/system.object.gettype...
iterera genom listan med object (t.ex. foreach), kolla vilken typ det är och öka på en räknare beroende på typ?

Visa signatur

Nikon D90, Nikon D7000, SB-600, 2xYN-460, Nikkor 18-105mm/3.5-5.6 VR, Nikkor 35mm/1.8, Nikkor 50mm/1.8D, Tamron 70-200/2.8, Tokina 11-16/2.8, Nikon 85/3.5 Macro
Flickr

Permalänk

IEnumerable har ju en extension som heter OfType, anropa den för att filtrera ut till vilken typ du vill ha och anropa sedan count
http://msdn.microsoft.com/en-us/library/bb360913.aspx

int item1Count = items.OfType<Item1>().Count(); int item2Count = items.OfType<Item2>().Count();

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Jag tänkte jag skulle va smart och göra en kombo av era svar men det gick inte riktigt.

IEnumerable<Item> itemsDistincts; itemsDistincts = items.Distinct(); foreach (Item item in itemsDistincts) { items.OfType<item.GetType()>().Count(); }

Men här gnäller den på item.GetType() istället.

Permalänk
Medlem

Testade en sak som de rekommenderar här http://msdn.microsoft.com/en-us/library/bb348436.aspx men förstår inte varför det inte fungerar.

IEnumerable<Item> itemsDistincts = items.Distinct(); foreach (var item in itemsDistincts) { int occurances = items.Count(x => x.GetType() == item.GetType()); }

Även om jag väljer ut distinct Item från listan så får jag upp ALLA objekt när jag itererar igenom itemsDistincts listan.

Permalänk
Medlem
Skrivet av Zelloxy:

Testade en sak som de rekommenderar här http://msdn.microsoft.com/en-us/library/bb348436.aspx men förstår inte varför det inte fungerar.

IEnumerable<Item> itemsDistincts = items.Distinct(); foreach (var item in itemsDistincts) { int occurances = items.Count(x => x.GetType() == item.GetType()); }

Även om jag väljer ut distinct Item från listan så får jag upp ALLA objekt när jag itererar igenom itemsDistincts listan.

Distinct returnerar alla unika objekt och resultatet hänger på om/hur man gjort en override på Equals.

(OBS! all kod är helt otestad, så det kanske inte ens kompilerar...)

ex:

var nums = new[]{ 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 7 }; var distinctNums = nums.Distinct(); // distinctNums bör nu innehålla 1, 2, 3, 4, 5, 6, 7

jag misstänker att du kanske är ute efter något sånt här:

var itemTypes = items.Select(x => x.GetType()).Distinct(); // EDIT: hade glömt Distinct()... foreach (var type in itemTypes) { Console.WriteLine("{0}.Count = {1}", type, items.Count(x => x.GetType() == type); }

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av Zelloxy:

Jag tänkte jag skulle va smart och göra en kombo av era svar men det gick inte riktigt.

IEnumerable<Item> itemsDistincts; itemsDistincts = items.Distinct(); foreach (Item item in itemsDistincts) { items.OfType<item.GetType()>().Count(); }

Men här gnäller den på item.GetType() istället.

Du kan inte köra item.GetType() i en generic...

var item2count = items.OfType<Item2>().Count(); var itemCount = items.Count() - item2count;

Eftersom Item2 ärver från Item så kan du inte köra items.OfType<Item>() då den även returnerar Item2 förekomster.

Permalänk

Det här skriver ut i konsolen hur många objekt av en viss typ det finns i listan items:

var counts = new Dictionary<Type, int>(); foreach (var type in items.Select(item => item.GetType())) counts[type] = (counts.ContainsKey(type) ? counts[type] : 0) + 1; foreach (var count in counts) Console.WriteLine("Type = {0}, Count = {1}", count.Key, count.Value);

Alternativt kan de tre första raderna bytas ut mot:

var types = items.Select(item => item.GetType()); var counts = types.Distinct().ToDictionary(t => t, t => types.Count(ty => ty == t));

Oj nu ser jag att jovnas hade gett (typ) det här svaret redan, tokigt.

Permalänk
Medlem
Skrivet av jovnas:

jag misstänker att du kanske är ute efter något sånt här:

var itemTypes = items.Select(x => x.GetType()).Distinct(); // EDIT: hade glömt Distinct()... foreach (var type in itemTypes) { Console.WriteLine("{0}.Count = {1}", type, items.Count(x => x.GetType() == type); }

Precis det jag var ute efter. Mycket snyggt. Jag gjorde en liten krångligare variant då det stod still, men har nu kopierat din istället. Tack så mycket!

Permalänk
Medlem

Ett annat alternativ, så länge som du vet vilken/vilka typer av objekt du vill räkna är
Console.WriteLine(items.FindAll(T => T is Item2).Count);

Visa signatur

mm, just de!