2010-12-30 11 views
1

Ich habe eine Arraylist, die Werte hat einige von ihnen wiederholt werden. Ich brauche die Anzahl der wiederholten Werte. Ist das in C# möglich?wie finden Sie keine doppelten Werte in Arraylist

+0

Möchten Sie "klassische" C# -Syntax oder verwendet Linq OK? (d. h. verwenden Sie 3,5?) – Greg

+0

Möchten Sie eine Anzahl von Elementen, die wiederholt werden oder eine Gesamtzahl von Wiederholungen? Bedeutung, 'foo' ist in der Liste dreimal, ist das 1 Element, das wiederholt wird oder sind es 2 Wiederholungen? –

+1

Ich brauche in reinem C#, es ist keine der Zeiten foo ist – Prady

Antwort

3

Wenn Ihr Objekt entspricht Methode korrekt nur Distinct() von System.Linq Namespace overrided rufen sie

Sie die Arraylist erfordern homogene und rief Cast<YourType>() vor Distinct() zu sein.

Dann subtrahieren Sie die Länge der ArrayList von der Distinct-Sequenz.

arraList.Count - arraList.Cast<YourType>().Distinct().Count() 

wird es werfen Ausnahme, wenn Ihre Artikel in Arraylist nicht vom Typ ist YourType, und wenn Sie OfType<YourType> verwenden filtert Objekte Objekte vom Typ YourType.

, aber wenn Sie die Anzahl jedes Wiederholungselements möchten, ist dies nicht Ihre Antwort.

+0

Deutlich entfernte Dups, nicht gefunden;) –

+0

Es ist besser zu Verwenden Sie 'OfType ' anstelle von 'Cast ' weil zuerst nur richtige Objekte zurückgegeben werden, während Ihre - einen Fehler auslösen. Wie auch immer, es ist viel besser, generische Sammlungen zu verwenden – abatishchev

+0

Sicher hast du Recht –

3

here ist ein großer Beitrag, wie es mit LINQ zu tun

var query = 
    from c in arrayList 
    group c by c into g 
    where g.Count() > 1 
    select new { Item = g.Key, ItemCount = g.Count()}; 

foreach (var item in query) 
{ 
    Console.WriteLine("Country {0} has {1} cities", item.Item , item.ItemCount); 
} 
+0

er sagt, er verwendet linq nicht, aber das ist genau das, was ich eingeben würde. – phillip

2
myList.GroupBy(i => i).Count(g => g.Count() > 1) 

und wenn Sie speziell Arraylist müssen

ArrayList arrayList = new ArrayList(new[] { 1, 1, 2, 3, 4, 4 }); 
Console.WriteLine(arrayList.ToArray().GroupBy(i => i).Count(g => g.Count() > 1)); 

Basierend auf Kommentare von Plakat

ArrayList arrayList = new ArrayList(new[] { 1, 1, 2, 3, 4, 4 }); 
Console.WriteLine(arrayList.ToArray().Count(i => i == 4)); 
+0

-1: Es zeigt nicht die richtige Anzahl von Duplikaten und auch das gezeigte Beispiel ist mit Liste, nicht mit ArrayList. –

+0

@ AS-CII wie? –

+0

+1 brauchen Sie nicht so etwas: '.GroupBy (i => i) .Zahl (g => g ==" foo "&& g.Count()> 1)' zusätzlich? – hunter

3
public Dictionary<T,int> CountOccurences<T>(IEnumerable<T> items) { 
    var occurences = new Dictionary<T,int>(); 
    foreach(T item in items) { 
    if(occurences.ContainsKey(item)) { 
     occurences[item]++; 
    } else { 
     occurences.Add(item, 1); 
    } 
    } 
    return occurences; 
} 
+0

+1 Einfach und leicht zu verstehen. Obwohl ich denke, du meintest "Vorkommnisse.Zulegen", nicht "Vorkommen.Put". –

+0

Ja, ich weiß nicht, warum so viele Leute darauf bestehen, Linq für jedes Problem zu benutzen. Das ist die meiste Zeit ziemlich unbezahlbar. –

1
int countDup = ArrayList1.Count - ArrayList1.OfType<object>().Distinct().Count(); 
+0

Wenn also ein Gegenstand 5 Mal wiederholt wird, würden Sie 4 wiederholte Gegenstände zurückgeben? –

+0

ändern Sie die Länge zu Graf Typ :-) –

+0

@Jani: Danke, Bruder! =) – abatishchev

0
var items = arrayList.Cast<object>() 
    .GroupBy(o => o) 
    .Select(g => new { Item = g, Count = g.Count() }) 
    .ToList(); 

jedes Element der Ergebnisliste wird zwei Eigenschaften haben: - Graf Quelle Artikel - Artikel

0

in Quellenliste zählen Sie es sortieren könnte, dann wird es sehr einfach.

Bearbeiten: Sortierung wird ein strittiger Punkt, wenn auf diese Weise getan.

Arraylist myList = new ArrayList(); 

myList = someStuff; 
Dictionary<object, int> counts = new Dictionary<object,int>(); 
foreach (object item in myList) 
{ 
    if (!counts.ContainsKey(item)) 
    { 
     counts.Add(item,1); 
    } 
    else 
    { 
     counts[item]++; 
    } 

} 

Edit:

Einige kleinere Dinge variieren können (nicht sicher über einige meiner eckigen Klammern, ich bin ein wenig rostig mit C#), aber das Konzept sollte Prüfung standhalten.

+0

Ich verstehe nicht, warum das sortiert werden muss. – Jason

+0

Wenn Sie es nicht sortieren, müssten Sie die Liste für jedes Objekt (foreach innerhalb einer foreach) scannen, das macht es viel schneller. –

+0

nehme an, es gibt foo 3 mal, gebühr 2 mal, wie bekomme ich foo = 3 und fee = 2 zu sehen. Bitte vergib mir, wenn die Frage sehr einfach in der Natur war – Prady

0

Sie können diese vielen Möglichkeiten nutzen. Der erste, der zu mir kommt, würde durch die Werte in Ihrer Array-Liste zu einer Gruppe sein, und nur die Gruppierung zählt zurückkehren, die älter als 1.

ArrayList al = new ArrayList(); 
al.Add("a"); 
al.Add("b"); 
al.Add("c"); 
al.Add("f"); 
al.Add("a"); 
al.Add("f"); 

int count = al.ToArray().GroupBy(q => q).Count(q=>q.Count()>1); 

count den Wert von 2 als a und f dupliziert zurückzukehren.

Verwandte Themen