2017-05-23 3 views
2

Ceci est mon code:Comment puis-je vérifier les valeurs extraites de cette requête Linq en tant que .ToLower()?

DataRow r = VirtualTable 
    .AsEnumerable() 
    .FirstOrDefault(tt => (tt.Field<string>("Column1") == value1) || 
         (tt.Field<string>("Column1") == value2)); 

Ce code récupère une ligne de données dont 'Column1' correspond à une chaîne donnée. Je vérifie alors ceci contre une déclaration de bool si. Cependant, bien que je puisse changer la capitalisation de ma chaîne, je ne sais pas comment la gérer avec la valeur que Linq me donne. J'apprends encore linq, donc je ne connais pas encore mon chemin. En bref, j'ai la chaîne "Red box" dans la table, mais je veux qu'elle soit lue comme "boîte rouge" donc elle correspondra à ma chaîne interne de même valeur.

En outre, j'essayais de récupérer le IndexOf la ligne que cette requête me donne, mais je récupère toujours un -1 même s'il trouve une correspondance.

Voici le code pour le récupérer:

int SelectedIndex = VirtualTable.Rows.IndexOf(r); 
+0

'.FirstOrDefault (tt => (tt.Field ("Colonne1") ToLower() == valeur1)' – Nino

+0

pourquoi ne pas utiliser 'tt.Field (" Colonne1 "). ToLower() ==" boîte rouge "'? – HimBromBeere

+3

Qu'est-ce que 'VirtualTable'? Pourquoi utilisez-vous' AsEnumerable() '? Si vous avez utilisé EF, la comparaison de chaînes Pour l'instant, vous pouvez utiliser 'String.Equals' avec une option insensible à la casse –

Répondre

5

Essayez string.Equals ignorer la casse et la surcharge Select pour obtenir l'index de ligne.

var row = VirtualTable 
    .AsEnumerable() 
    .Select((tt, index) => new { 
     value = tt.Field<string>("Column1"), 
     index = index}) 
    .FirstOrDefault(item => 
     string.Equals(item.value, value1, StringComparison.OrdinalIgnoreCase) || 
     string.Equals(item.value, value2, StringComparison.OrdinalIgnoreCase)); 

    // If we have the row found, we can get 
    if (row != null) { 
    var r = row.value;    // value, e.g. "bla-bla-bla" 
    int selectedIndex = row.index; // as well as its index, e.g. 123 
    ... 
    } 
+0

Cela a fait l'affaire, merci! Je vais tester l'efficacité de String.Equals sur mes données. – Arvayne

+0

@Arvayne: vous êtes les bienvenus! Puisque 'string.Equals' a été * spécialement conçu * pour tester l'égalité des chaînes, il a de très bonnes chances d'être l'approche la plus efficace. –

4

Vous pouvez utiliser String.Equals(string,StringComparisonOption) pour comparer deux chaînes en utilisant une comparaison insensible à la casse. Cela évite de générer encore-un autre-chaîne temporaire ToLower() ferait, par exemple:

tt.Field<string>("Column1").Equals(value1,StringComparison.OrdinalIgnoreCase) 

ou

tt.Field<string>("Column1").Equals(value1,StringComparison.CurrentCultureIgnoreCase) 

Assurez-vous que vous utilisez l'option de comparaison appropriée. Différentes cultures ont des règles de tubage différentes. Ordinal est l'option la plus rapide car elle compare les chaînes en utilisant des règles binaires.