11
votes

LINQ Expression Pour définir toutes les valeurs d'un tableau à une valeur donnée

J'ai un peu de code que je voudrais me transformer en une expression LINQ (de préférence avec Lambdas) pour faciliter l'utilisation en tant que délégué. Le code ressemble à ceci: xxx

pour la vie de moi, je ne peux pas sembler comprendre celui-ci. J'ai essayé d'utiliser des formes de sélection et diverses formes de sélection, etc. Rien ne semble fonctionner correctement.

FYI, je sais que DateTime par défaut à Minvalue, en réalité, cela nettoie les tableaux à défaut après leur " J'ai déjà été défini.

Quelqu'un peut-il m'aider avec une expression de travail?

EDIT:

Je suppose que je dis ce que je dis vraiment ici est que je veux une manière concise de définir tous les éléments d'une matrice multidimensionnelle à une valeur donnée. Certes, les travaux de boucle imbriqués, et je peux certainement le placer dans une fonction (ce que j'ai déjà fait). Je veux juste quelque chose de plus concis qui puisse être utilisé plus facilement dans un délégué sans créer de monstre multiligne.


0 commentaires

5 Réponses :


2
votes

LINQ n'est pas vraiment destiné à être utilisé pour la mise à jour des collections. Il s'agit d'interroger, c'est-à-dire créer des énumérables sur les collections existantes. Je pense que votre code est parfaitement lisible et n'améliore pas beaucoup si vous le forcez à avoir beaucoup de lambdas et de tels.

Si vous souhaitez créer une nouvelle liste code> avec chacun Elément défini sur une valeur, vous pouvez le faire: p> xxx pré>

si vous vraiment em> veux le faire en utilisant foreach code> / LINQ, il est possible d'abuser Sélectionnez CODE> (mais je ne le recommande pas): P>

changes.ForEach(array => array.Select((dt, i) => array[i] = DateTime.Now)
                              .LastOrDefault());


2 commentaires

Je ne comprends vraiment pas pourquoi vous dites que ce n'est pas censé cela. Pensez à une requête typique LINQ2SQL où vous interrogez des données, puis mettez à jour les valeurs. En quoi est-ce différent?


Avec LINQ2SQL, vous interrogez la base de données, puis modifiez les objets renvoyés. Si vous souhaitez modifier tous les objets retournés, vous devez toujours utiliser une boucle pour itérer les objets. Et l'énumérable contenant les objets n'est pas modifié du tout. LINQ est à propos d'interrogation, pas pour la mise à jour des collections.



2
votes

Une question intéressante, mais Linq est sur interrogeant et ce que vous faites ici ne ressemble pas beaucoup à une requête pour moi. Même s'il y a une solution là-bas, je ne suis pas sûr que j'utilise Linq pour quelque chose comme ça.


4 commentaires

Je suis en désaccord, c'est en fait une requête, mais une requête avec des effets secondaires. Je demande à renvoyer tous les éléments d'une liste , donc je peux alors définir ces valeurs. Il existe de nombreuses questions telles que LINQ, telles que la transofrmation en saillie, etc. Je ne vois pas vraiment comment cela est différent.


Il n'y a pas une seule requête à Linq qui modifie la collection interrogée (donc "requête").


rien qui modifie l'original mais je pense que ce qu'il tente d'accomplir peut être fait ...


Il ne serait pas du tout difficile d'écrire une "requête" Linq avec des effets secondaires pour faire ce que l'homme de Mystere a besoin, mais (a) ce serait un hack sale, et (b) cela nécessiterait probablement autant de code que Solution équivalente, nettoyante et non linq.



0
votes

Pouvez-vous décrire certains cas d'utilisation de la façon dont vous proposez d'utiliser ledit délégué?

Je veux dire, si populateChanges () vous renvoie une liste <> de DateTime Tareaux, et vous les traversez tous et vous les définissez sur DateTime.Minvalue, quelle est exactement l'unité de code que vous souhaitez mettre dans le déléguer?


1 commentaires

Tout ce que je fais, c'est créer un exemple de travail, comme dit mon Fyi .. Je viens vraiment de faire la partie à la boucle (le reste est simplement configuré) dans une zone différente de celle-ci. J'ai une autre liste qui contient les données, il suffit de mapper chaque élément de la matrice de chaîne à une heure où ils ont changé la dernière fois. Lorsque des modifications sont effacées, j'ai besoin de réinitialiser les temps à minvalue. Lorsque de nouveaux changements se produisent, ces éléments obtiennent une nouvelle date d'heure.



0
votes

Il y a toujours de meilleures pratiques et telle mais je ne sais pas si je suis d'accord avec tout ce que tout le monde a dit ...

Si je vous comprends correctement, vous devez énumérer votre tableau imbriqué pour plusieurs raisons différentes et voudriez-vous Pour encapsuler cette fonctionnalité à réutiliser. Il existe plusieurs façons différentes d'accomplir, mais voici une utilisation de Linq et une avec ... P>

//Add a Day to each datetime value
ForEachOnNestedDates(changes, (DateTime date) => date.AddDays(1));

//You also make it even more readable
ForEachOnNextedDates(changes, DoSomethingWithDate);

private DateTime DoSomethingWithDate(DateTime value)
{

}


1 commentaires

L'attribution d'une valeur à un paramètre d'un lambda ne change pas la collection interrogée ...



14
votes

Cela devrait faire le tour.

Ce n'est pas Linq, et ce n'est pas vraiment très différent de votre pour code> des boucles code>, juste moins verbeux. P>

changes.ForEach(x => Array.Clear(x, 0, x.Length));


1 commentaires

J'aime ça. Assez proche pour moi, je pense.