Dictionary i zwracanie jednej z powtarzających się wartości

0

Cześć, mam problem ze słownikiem, wiem jak zwrócić wartość która się powtarza najwięcej razy, problem gdy dwie wartości powtarzają się tyle samo razy i chcę zwrócić jedną z nich, napisałem taki kod i on działa ale nie do końca tak jak powinien, ma ktoś pomysł jak przerobić to w sposób taki aby przy danych wejściowych np (1,1,2,2) wylosował mi wartość 1 lub 2 a nie za kazdym razem brał 1? wartości to liczby całkowite

int[] input = { tab1[0].R, tab1[1].R, tab1[2].R, tab1[3].R };

                            var dict = new Dictionary<int, int>();
                            foreach (var o in input)
                                if (dict.ContainsKey(o))
                                    dict[o]++;
                                else
                                    dict[o] = 1;
                            int temp = 0;
                            int temp2 = 0;
                            foreach (var d in dict)
                                if (d.Value > temp && d.Key > 0) { temp = d.Value; temp2 = d.Key; }

                            tab[i, j].R2 = temp2;
0

Zapisuj najczesciej powtarczane elementy w liscie a nie pojedyczej zmiennej. A nastepnie wylosuj wartosc z listy :)

0

Ja bym to zrobił za pomocą linq

            int[] test = new int[] { 0, 0, 1, 1,2,3,4,5,6,7,8,9,10,11 };
            var query = (from item in test
                         group item by item into g
                         orderby g.Count() descending
                         select new { Item = g.Key, Count = g.Count() }).ToArray();
            var query1 = query.Where(item => item.Count == query[0].Count).OrderBy(a => Guid.NewGuid()).First().Item;
        

Pisałem na szybko więc musisz to wszystko jakoś sensownie nazwać.

3

Na moje oko problem ze słownikiem wynika z jego użycia w ogóle. Jakby się go pozbyć, to problemu nie będzie.

var grouped = input.GroupBy(x => x).Select(x => new { Count = x.Count(), Value = x.Key } );
var allMaximal = grouped.Where(x => x.Count == grouped.Max(x => x.Count));
var randomMaximal = allMaximal.OrderBy(x => Guid.NewGuid()).First().Value;

1 użytkowników online, w tym zalogowanych: 0, gości: 1