2011-08-16 6 views
33

J'ai 2 classes qui ont des propriétés identiques. Je stocke dans une liste les propriétés de la 1ère classe, et après cela, je veux prendre quelques propriétés nécessaires et les mettre dans une liste de type 2ème classe. J'ai fait une séquence de cast en C# et ça fonctionne bien, mais je dois faire avec LINQ. J'ai essayé de faire quelque chose mais sans de bons résultats. Aidez-moi s'il vous plaît avec des suggestions.Utilisation de LINQ pour convertir la liste <U> en Liste <T>

1re classe:

public class ServiceInfo { 
    private long _id; 
    public long ID { 
     get { return this._id; } 
     set { _id = value; } 
    } 

    private string _name; 
    public string Name { 
     get { return this._name; } 
     set { _name = value; } 
    } 

    private long _qty; 
    public long Quantity { 
     get { return this._qty; } 
     set { _qty = value; } 
    } 

    private double _amount; 
    public double Amount { 
     get { return this._amount; } 
     set { _amount = value; } 
    } 

    private string _currency; 
    public string Currency { 
     get { return this._currency; } 
     set { _currency = value; } 
    } 

    private DateTime? _date; 
    public DateTime? Date { 
     get { return this._date; } 
     set { _date = value; } 
    } 
} 

2e classe:

class InvoiceWithEntryInfo { 
    private string currencyField; 

    private long IdField; 
    public long IdIWEI { 
     get { return this.IdField; } 
     set { IdIWEI = value; } 
    } 

    private string nameField; 
    public string NameIWEI { 
     get { return this.nameField; } 
     set { NameIWEI = value; } 
    } 

    private long qtyField; 
    public long QuantityIWEI { 
     get { return this.qtyField; } 
     set { QuantityIWEI = value; } 
    } 

    private double amountField; 
    public double AmountIWEI { 
     get { return this.amountField; } 
     set { AmountIWEI = value; } 
    } 

    private DateTime dateField; 
    public DateTime? DateIWEI { 
     get { return this.dateField; } 
     set { DateIWEI = value; } 
    } 

    public string OwnerIWEI { 
     get; set; 
    } 
} 

C# échantillon court OK: ...

var sil = new List<ServiceInfo>(); 
var iweil = new List<InvoiceWithEntryInfo>(); 

...

if (sil != null) 
    { 
     foreach (ServiceInfo item in sil) 
     { 
      iweil.Add(new InvoiceWithEntryInfo 
       { 
        IdIWEI = item.ID, 
        AmountIWEI = item.Amount, 
        DateIWEI = item.Date 
       }); 
     } 

échantillon LINQ Wich ne marche pas courir OK:

  iweilCOPY = sil.ConvertAll<InvoiceWithEntryInfo>(a => (InvoiceWithEntryInfo)a); 

      iweilCOPY = sil.FindAll(a => (sil is InvoiceWithEntryInfo)).ConvertAll<InvoiceWithEntryInfo>(a => (InvoiceWithEntryInfo)a); 
+3

:) J'étais au début en 2011. Maintenant, je ris quand je vois cette question. (rire) Grands moments !!! – meorfi

Répondre

59
var iweilCopy = sil.Select(item => new InvoiceWithEntryInfo() 
{ 
    IdWEI = item.Id, 
    NameWEI = item.Name, 
    .... 
}).ToList(); 
10
var iweil = sil.Select(item=> new InvoiceWithEntryInfo { 
       IdIWEI = item.ID, 
       AmountIWEI = item.Amount, 
       DateIWEI = item.Date}).ToList(); 
5

utiliser Il suffit de sélectionner:

if(sil != null) 
{ 
    var iweil = sil.Select(item=>new InvoiceWithEntryInfo() 
      { 
       IdIWEI = item.ID, 
       AmountIWEI = item.Amount, 
       DateIWEI = item.Date 
      }).ToList(); 
} 
8

Vous avez besoin d'une fonction pour convertir une instance T à une instance U:

ResultType ConvertMethod(StartType input) 

et vous devez écrire ceci. Puis

outputList = inputList.Select(ConvertMethod).ToList(); 

l'appliquera à l'ensemble de la collection d'entrée. La fonction de conversion peut être un lambda écrit en ligne mais n'a pas besoin d'être (si la fonction a la bonne signature, comme ConvertMethod alors le compilateur le convertira correctement pour passer à Select).

+1

Pourriez-vous fournir un exemple réel, pls? Votre réponse est la meilleure! –

+0

Liste nombres = nouveau Liste () {1, 2, 3}; Func numToStringWithLPad = i => "Numéro:" + i; var numAsString = nombres.Sélectionnez (numToStringWithLPad); numAsString.ToList(). ForEach (i => Console.WriteLine (i)); Sortie: Numéro: 1 Numéro: 2 Numéro: 3 –

2

Votre code C# normal et LINQ ne sont pas équivalents. Dans le C# normal, vous instanciez une nouvelle instance de l'autre classe et initialisez les propriétés, alors que vous essayez de convertir (bien convertir) de l'une à l'autre; Cependant, comme ils ne se trouvent pas dans la même hiérarchie de classe, vous ne pouvez pas les convertir, et comme vous n'avez pas défini d'opérateur de conversion, vous ne pouvez pas non plus convertir (en utilisant la syntaxe de conversion).

Soit vous devez définir un opérateur de conversion

public static explicit operator InvoiceWithEntryInfo(ServiceInfo item){ 
    return new InvoiceWithEntryInfo { 
      IdIWEI = item.ID, 
      AmountIWEI = item.Amount, 
      DateIWEI = item.Date}; 
} 

ou une méthode de création en utilisant la signature de la méthode régulière. Je suggérerais ce dernier puisque les premiers prétendent être quelque chose que ce n'est pas. Ce n'est pas une distribution et j'aimerais personnellement pouvoir voir que le code crée une nouvelle instance basée sur une entrée.

Questions connexes