2011-07-30 6 views
3

J'ai un problème simple, mais je ne comprends pas l'un des exemples que je trouve ici ou dans MSDN. (Je suis encore nouveau pour C# et toutes les fonctions de jeux de données). J'ai un datable "tblRoom" que ses columms sont "bâtiment", "appartement" et "pièce" et ils sont tous ints et les clés primaires de la table (c'est une entité faible de l'appartement (qui est une entité faible de bâtiment) sans autres propriétés/colonnes).Comment trouver la valeur maximale dans une colonne dans une barre de données []?

J'ai aussi DataRow[] roomCollection qui sélectionne un appartement spécifique dans un immeuble avec ce code:

roomCollection = dbDataSet.tblRoom.Select("building ='"+ b_int + 
              "' and apartment='"+ a_int + "'"); 

Tout cela fonctionne très bien (je suppose ...). Maintenant, je veux obtenir la valeur maximale de la chambre de cet appartement (le nombre de chambre maximum dans cet appartement). J'ai essayé en vain ces codes:

DataRow dr = roomCollection.Max(); 
int maxi = roomCollection.Max(); 

Je ne reçois pas de l'info-bulle ce que je suis supposé écrire dans la fonction. Il génère des exceptions sur IEnumerable ou Icomparable.

Que dois-je écrire pour obtenir la valeur max (int) dans la colonne de la pièce? Tout le monde connaît un "[quelque chose] pour les nuls" qui l'explique à un idiot parce que je ne comprends pas la signification des erreurs/tooltip de ce que je suis supposé écrire dans le Max().

EDIT: L'info-bulle suggèrent d'entrer dans ces (voir ci relevants):

(this IEnumerable <DataRow> source):DataRow 
(this IEnumerable <DataRow> source, Func<DataRow,int?> selector):int? 
(this IEnumerable <DataRow> source, Func<DataRow,int> selector):int 

Je ne comprends vraiment pas :(

Merci d'avance, Shay

Répondre

3

essayer

int roomno = roomCollection.Max (r => (int) r["room"]); 
+0

Ah ça marche! Merci beaucoup. J'ai juste 2 autres petites questions: 1. Est-ce que cette syntaxe est LINQ? 2. Qu'est-ce que cela signifie? var "r" obtient (casted int) de ["room"]? Je ne comprends vraiment pas comment passer cette connaissance à d'autres problèmes ... pourquoi "r" est l'opérande gauche de => et sur le côté droit de celui-ci trop près du nom de la colonne? –

+1

la syntaxe est linq avec des délégués ... le r est le premier paramètre du délégué et est de type DataRow (puisqu'il provient de DataRowCollection rommCollection) et après => c'est le corps du délégué représentant cette valeur utilisée par le Max méthode d'extension à évaluer ... – Yahia

1

dans ce domaine. Si vous voulez passer le sélecteur à Max() pour identifier correctement la colonne que vous voulez max ..

int max = roomCollection.Max(dr => (int)dr["room"]); 
+0

Ha ça marche! Merci beaucoup. –

1

Depuis roomCollection est un tableau de DataRows, DataRow dr = roomCollection.Max(); moyens de sélection DataRow maximale de roomCollection. Mais qu'est-ce que cela signifie pour un DataRow d'être plus grand qu'un autre DataRow? En général, il n'y a aucune comparaison utile, c'est pourquoi .Max() échoue sur vous.

Techniquement DataRow n'implémente pas IComparable car il est utile sur le plan générique de comparer deux DataRow et de dire lequel est le plus grand ou le plus petit. Cependant, pour les entiers, il y en a puisque 2 est plus grand que 1.

Ce que vous devez faire est de passer une fonction de sélection à Max() pour indiquer la valeur maximale que vous recherchez. Alors que l'indication d'autres réponses de vous devez utiliser:

int max = roomCollection.Max(dr => (int)dr["room"]); 

Cela dit pour chaque datarow sélectionner la valeur entière pour la chambre et obtenir la valeur maximale de la chambre.

La fonction .Max() fait partie de Linq (Language Integration Query) ajoutée dans .NET 3.5. Vous devez donc lire sur ce sujet pour mieux comprendre ce qui se passe.J'ai trouvé 101 Linq Samples pour être utile car il montre des exemples pour presque tout ce que vous voulez faire.

+0

MERCI BEAUCOUP! Merci beaucoup. :) –

Questions connexes