Mi sono imbattuto in uno scenario interessante, a cui non sono riuscito a trovare una soluzione. Supponiamo di dover trovare il majorant in una sequenza (il numero che si verifica almeno n/2 + 1
volte, dove n
corrisponde alla dimensione della sequenza). Questa è la mia realizzazione:SingleOrDefault() quando la sequenza contiene il valore predefinito
public static int FindMajorant(IList<int> numbers)
{
return numbers
.GroupBy(x => x)
.Where(g => g.Count() >= numbers.Count/2 + 1)
.Select(g => g.Key)
.SingleOrDefault();
}
sto usando SingleOrDefault()
, che restituisce l'elemento se è trovato nella sequenza o il valore di default per il tipo: in questo caso, verrà restituito 0
in quanto è il valore predefinito per un int
. Ad esempio, il mio metodo restituisce 3
per la seguente sequenza:
List<int> sampleNumbers = new List<int>() { 2, 2, 3, 3, 2, 3, 4, 3, 3 };
, che è il comportamento previsto.
Tuttavia, cosa succede se il majorante nella sequenza è zero (0
)? Restituirebbe 0, ma in questo modo, come potrei determinare se è lo zero da SingleOrDefault()
come valore predefinito o il majorant? Forse, potrei usare Single()
, ma ciò creerebbe un'eccezione che è praticamente incorrente. Potrei anche cogliere questa eccezione, ma mi sembra una cattiva pratica. Quindi la mia domanda è, qual è il modo preferito per gestire questa situazione?
Nota che si può tirare 'numbers.Count/2 + 1' fuori della query e in una variabile per evitare di ricalcolarlo per ogni singolo gruppo. – Servy
@Servy non è 'Count' una proprietà di' IList 'quindi non viene effettivamente calcolato? –
@MichaelMcGriff Si riferisce all'espressione nel suo insieme. – arnaudoff