2017-02-24 1 views
-2

J'ai ce code:Moulage de IEnumerable <object> à IEnumerable <decimal>

IDictionary<string, IEnumerable<object>> setValues = new Dictionary<string, IEnumerable<object>>() 
{ 
    { "IN_PARTENER", dtResult.Rows.Cast<DataRow>().Select(row => row["IN_PARTENER"]) }, 
    { "IN_DATA", dtResult.Rows.Cast<DataRow>().Select(row => row["IN_DATA"]) }, 
    { "IN_VALOARE", dtResult.Rows.Cast<DataRow>().Select(row => row["IN_VALOARE"]) }, 
    { "OUT_PARTENER", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_PARTENER"]) }, 
    { "OUT_DATA", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_DATA"]) }, 
    { "OUT_VALOARE", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_VALOARE"]) }, 
    { "TOTAL_ZI", dtResult.Rows.Cast<DataRow>().Select(row => row["TOTAL_ZI"]) }, 
}; 

Je veux convertir la chaîne IN_VALOARE et OUT_VALOAREstring-decimal mais je ne sais pas comment le faire

Répondre

4

Vous pouvez le faire à l'intérieur du Select:

.Select(row => (decimal)row["IN_VALOARE"]) 

Code complet:

IDictionary<string, IEnumerable<object>> setValues = new Dictionary<string, IEnumerable<object>>() 
{ 
    { "IN_PARTENER", dtResult.Rows.Cast<DataRow>().Select(row => row["IN_PARTENER"]) }, 
    { "IN_DATA", dtResult.Rows.Cast<DataRow>().Select(row => row["IN_DATA"]) }, 
    { "IN_VALOARE", dtResult.Rows.Cast<DataRow>().Select(row => (decimal)row["IN_VALOARE"]) }, 
    { "OUT_PARTENER", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_PARTENER"]) }, 
    { "OUT_DATA", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_DATA"]) }, 
    { "OUT_VALOARE", dtResult.Rows.Cast<DataRow>().Select(row => (decimal)row["OUT_VALOARE"]) }, 
    { "TOTAL_ZI", dtResult.Rows.Cast<DataRow>().Select(row => row["TOTAL_ZI"]) }, 
}; 

Puisque vous ne pouvez pas faire un dictionnaire avec différents types de valeur (sans avoir hacky), peut-être vous devriez envisager d'utiliser une classe personnalisée à la place:

public class MyThing 
{ 
    public string InPartener { get; set; } 
    public string InData { get; set; } 
    public decimal InValoare { get; set; } 
    public string OutPartener { get; set; } 
    public string OutData { get; set; } 
    public decimal OutValoare { get; set; } 
    public string TotalZi { get; set; } 
} 

Et faire une liste des personnes classes:

var myThings = dtResult.Rows.Cast<DataRow>().Select(r => new MyThing 
{ 
    InPartener = r["IN_PARTENER"], 
    InData = r["IN_DATA"], 
    InValoare = (decimal)r["IN_VALOARE"], 
    OutPartener = r["OUT_PARTENER"], 
    OutData = r["OUT_DATA"], 
    OutValoare = (decimal)r["OUT_VALOARE"], 
    TotalZi = r["TOTAL_ZI"] 
}; 
+0

j'ai essayé, mais j'eu cette erreur: ne peut pas convertir de IEnumerable à IEnumerable user7383186

+0

Eh bien, vous essayez de le stocker dans un dictionnaire incompatible maintenant, mais c'est une autre question. – DavidG

+0

comment dois-je faire? – user7383186

1

Vous pouvez ajouter decimal.Parse dans la sélection pour IN_VALOARE section

{ "IN_VALOARE", dtResult.Rows.Cast<DataRow>().Select(row => decimal.Parse(row["IN_VALOARE"].ToString())) }, 

qui donne

IDictionary<string, IEnumerable<object>> setValues = new Dictionary<string, IEnumerable<object>>() 
     { 
      { "IN_PARTENER", dtResult.Rows.Cast<DataRow>().Select(row => row["IN_PARTENER"]) }, 
      { "IN_DATA", dtResult.Rows.Cast<DataRow>().Select(row => row["IN_DATA"]) }, 
      { "IN_VALOARE", dtResult.Rows.Cast<DataRow>().Select(row => decimal.Parse(row["IN_VALOARE"].ToString())) }, 
      { "OUT_PARTENER", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_PARTENER"]) }, 
      { "OUT_DATA", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_DATA"]) }, 
      { "OUT_VALOARE", dtResult.Rows.Cast<DataRow>().Select(row => row["OUT_VALOARE"]) }, 
      { "TOTAL_ZI", dtResult.Rows.Cast<DataRow>().Select(row => row["TOTAL_ZI"]) }, 
     }; 
0

Tout d'abord, si besoin IEnumerable<object> vous n'avez pas vraiment besoin de jeter la valeur du champ décimal ou un autre type.

En second lieu, si vous avez besoin pour obtenir toutes les colonnes dans votre dictionnaire, alors tout votre code peut être simplifiée:

var setValues = dtResult.Columns.Cast<DataColumn>() 
     .ToDictionary(c => c.ColumnName, 
        c => dtResult.AsEnumerable().Select(r => r.Field<object>(c))); 

simple que cela - obtenir toutes les colonnes, puis créer le dictionnaire avec le nom de colonne comme clé et collection de valeurs de colonne en tant que valeur.


REMARQUE: Cela dépend de vos besoins, mais aussi envisager de travailler avec des entités fortement typées au lieu des dictionnaires, des chaînes et des objets. C'est à dire. définir entité

public class Transaction // chose good name here 
{ 
    public string InPartener { get; set; } 
    public string InData { get; set; } 
    public decimal InValoare { get; set; } 
    public string OutParener { get; set; } 
    public string OutData { get; set; } 
    public decimal OutValoare { get; set; } 
    public string TotalZi { get; set; } 
} 

L'utilisation LINQ à DataSet pour convertir votre DataTable en collection d'objets fortement typés:

var transactions = from r in dtResult.AsEnumerable() 
        select new Transaction { 
         InPartener = r.Field<string>("IN_PARTENER"), 
         InData = r.Field<string>("IN_DATA"), 
         InValoare = r.Field<decimal>("IN_VALOARE"), 
         OutPartener = r.Field<string>("OUT_PARTENER"), 
         OutData = r.Field<string>("OUT_DATA"), 
         OutValoare = r.Field<decimal>("OUT_VALOARE"), 
         TotalZi = r.Field<string>("TOTAL_ZI") 
        }; 

Cela vous donnera beau modèle d'affaires fortement typé avec le soutien de sens INTELI. Par exemple. si vous avez besoin pour calculer InValoare totale:

decimal total = transactions.Sum(t => t.InValoare);