Disons que j'ai une liste générique telle que celle-ci: J'essaie de remplacer le numéro de séquence donné avec un autre élément de mise à jour de la liste avec la séquence n ° 2 avec le numéro 5 avec le numéro 5 Comme ci-dessous: p> si le NewSeq ne deviendrait pas dupliquer, par exemple Newseq = 6, je pouvais juste faire commander: p> mais le problème est quand ils deviennent des doublons, j'ai besoin que le NewSeq devienne en séquence # 5 et bump l'autre séquence dupliquée # 5 + 1. P> Aide à l'aide de toutes les directives en résolvant cela. Merci. P> mise à jour: certains cas lorsque la nouvelle séquence scénario A: P> 1: Category F
2: Category S
3: Category Z
5: Category X
6: Category V
4 Réponses :
Faites ce que Elgonzo a dit dans son commentaire. De plus, commencez avec des numéros de séquence largement espacés, c'est-à-dire 1000, 2000, 3000 plutôt que 1,2,3. Je ne connais pas votre cas d'utilisation, mais à moins que vous ne réorganisiez beaucoup, cela minimisera le nombre de "bosses" de numéros de séquence que vous devez faire.
En supposant que vous ayez déjà trié la liste en fonction de la Quelque chose comme ceci: Séquence , vous pouvez utiliser la méthode FindIndex de LINQ pour trouver l'index de l'élément avec currSeq et newSeq , puis utilisez RemoveAt avec Insert pour placer l'élément mis à jour à la bonne position. int currSeq = 2;
int newSeq = 5;
var oldIndex = categories.FindIndex(i => i.Sequence == currSeq);
var newIndex = categories.FindIndex(i => i.Sequence == newSeq);
if(oldIndex > -1)
{
var oldItem = lst[oldIndex];
oldItem.ID = newSeq;
if(newIndex > -1)
{
newIndex = newIndex-1 < 0 ? 0 : newIndex - 1; //in case the first element is the existing one
categories.RemoveAt(oldIndex);
categories.Insert(newIndex, oldItem);
}
else
{
categories = lst.OrderBy(i => i.ID).ToList();
}
}
Je pense que cela résoudra votre problème. Mais lors de l'insertion, toutes les lignes suivantes sont déplacées aussi. Est-ce que ça va pour vous?
Mise à jour basée sur le commentaire et l'OP modifié.
En supposant que votre classe de catégorie est définie comme suit.
1 Category F 2 Category S 3 Category Z 5 Category X 6 Category V
Vous pouvez rédiger la mise à jour Méthode de séquence comme suit pour obtenir le résultat souhaité lorsque newValue Entrée int currSeq = 3;
int newSeq = 1;
var result = categories.UpdateSequence(currSeq,newSeq).OrderBy(x=>x.sequence);
1 Category Z
2 Category S
3 Category F
5 Category X
6 Category V
Scénario 1:
int currSeq = 2; int newSeq = 1; var result = categories.UpdateSequence(currSeq,newSeq).OrderBy(x=>x.sequence);
Sortie
var categories = new List<Category>() {
new Category() { sequence = 3, categoryName = "Category F" },
new Category() { sequence = 1, categoryName = "Category S" },
new Category() { sequence = 2, categoryName = "Category Z" },
new Category() { sequence = 5, categoryName = "Category X" },
new Category() { sequence = 6, categoryName = "Category V" }
Scénario 2
public static List<Category> UpdateSequence(this List<Category> categories, int oldValue,int newValue)
{
var invalidState = -1;
if(oldValue>newValue)
{
categories.Single(x=>x.sequence == oldValue).sequence = invalidState;
if(categories.Any(x=>x.sequence == newValue))
{
categories = UpdateSequence(categories, newValue,newValue+1);
}
categories.Single(x=>x.sequence == invalidState).sequence = newValue;
}
else
{
if(categories.Any(x=>x.sequence == newValue))
{
categories = UpdateSequence(categories, newValue,newValue+1);
}
categories.Single(x=>x.sequence==oldValue).sequence = newValue;
}
return categories;
}
Sortie
public class Category
{
public int sequence{get;set;}
public string categoryName{get;set;}
}
merci beaucoup, mais quand newValue
@joegreentea J'ai mis à jour la réponse pour le cas que vous avez mentionné. Pourriez-vous vérifier si c'est la sortie souhaitée. Sinon, pourriez-vous s'il vous plaît mentionner la sortie souhaitée dans le scénario?
oui, ce serait la sortie souhaitée lorsque nouvelle séquence
La sortie que j'avais publiée était basée sur le même code. Seriez-vous en mesure de mettre à jour l'OP avec le scénario exact où vous rencontrez des problèmes et la sortie souhaitée dans un tel scénario
@joegreentea Mettez à jour la réponse en vous basant sur de nouveaux exemples que vous aviez prouvés. Veuillez vérifier
Eh bien, utilisez à nouveau Linq. Déterminez d'abord si votre liste categories a un objet Category qui a le même numéro de séquence que newSeq . Si aucun objet Category n'existe, vous n'avez pas besoin d'incrémenter. Sinon, Sélectionnez dans votre liste de catégories les objets Category dont les nombres de sequence sont égaux ou supérieurs à newSeq , et incrémentez séquence de ces objets Category . Fait...