LINQ: Utilisation .À l'exception de() sur les collections de différents types en les rendant convertible/comparables?

Donné deux listes de types différents, est-il possible de faire ces types convertibles entre ou comparables les uns aux autres (par exemple avec un TypeConverter ou similaire), de sorte qu'une requête LINQ pouvez comparer? J'ai vu d'autres questions similaires sur SI rien, mais que les points de rendre les types convertibles entre elles pour résoudre le problème.

Types De Collection:

public class Data
{
    public int ID { get; set; }
}

public class ViewModel
{
    private Data _data;

    public ViewModel(Data data)
    {
        _data = data;
    }
}

D'utilisation souhaitée:

    public void DoMerge(ObservableCollection<ViewModel> destination, IEnumerable<Data> data)
    {
        //1. Find items in data that don't already exist in destination
        var newData = destination.Except(data);

        //...
    }

Il semblerait logique que depuis que je sais comment comparer une instance de ViewModel à une instance de Données, je devrais être en mesure de fournir une comparaison logique que LINQ alors utiliser pour les requêtes comme .À l'exception de(). Est-ce possible?

  • Pauvre vieux for boucle, il est donc utile, mais, hélas, il n'a jamais fait le one-liner gens heureux.
  • Je ne suis pas d'accord avec le sentiment que vous exprimez. Nous avons les moyens de l'écriture de code maintenant que de plus en plus clairement exprime l'intention, sans vous soucier du mécanisme. for exprime mécanismes et obscurcit l'intention. Le LINQ-fonction one-liners que vous êtes en dénonçant souvent (oui, pas toujours) mieux l'intention d'exprimer et de masquer les mécanismes. Cela conduit à un code qui est plus facile à comprendre et à maintenir.
  • alors que j'étais irrévérencieux, toutes les fonctions à vous jeter dans une projection comme vous ne sont confère une présomption d'intention.
  • Je ne suis pas.
  • simplement que je suis d'accord lorsque le LINQ peaux de contrôle simple-structure de base de la logique. Une projection à partir d'un type à l'autre n'est pas un de ces cas, l'omi. C'est pas plus clair ce qui se passe que dans var newData = MeaningfulFunctionNameHere(destination, data); Dans les deux cas, nous faisons une hypothèse sur ce qui se passe vraiment. En réalité, j'étais vraiment juste se moquer de LINQ est cool et s'applique partout de la foule.
  • Quel est le problème avec vous? LINQ est cool et ne s'appliquent partout. 😉

InformationsquelleAutor James Cadd | 2012-04-03