Как подсчитать количество элементов в списке, которые перемещаются или вниз?C#

Место общения программистов C#
Ответить
Anonymous
 Как подсчитать количество элементов в списке, которые перемещаются или вниз?

Сообщение Anonymous »

Существует список объектов типа System.collections.generic.list. Пользователь может изменить порядок элементов, перемещая некоторые элементы вверх или вниз в списке. Процесс перемещения в списке такой: пользователь может выдвигать элемент вверх или вниз, поэтому элемент в индексе «I» меняет индекс на «I-1» для «UP» и на «I+1» для «Down». Например, если элемент «D» в индексе «3» перемещается вниз к индексу «4» вместо элемента «E», то индекс «3» из «D» изменяется на индекс «4», а элемент «E» изменяет индекс от «4» на индекс «3». Движение элемента «D» на «UP» похоже на это: индекс «3» из «D» изменяется на индекс «2», а элемент «C», который был в индексе «2», изменяет индекс от «2» на индекс »3». Я показал на картинке. Те же элементы могут быть перемещены пользователем несколько раз в разных направлениях.
Мне нужно сосчитать только те элементы, которые перемещаются пользователем, исключая элементы, которые изменили индексы только потому, что другие объекты подталкивали их вверх или вниз. «I+1» подталкивается к индексу «I». И не все движения считать удвоены. Если предмет движется дважды или вниз, тогда изменения в индексах составляют три. Например, если элемент перемещается дважды вниз, то количество измененных элементов Индекс будет 3 вместо 1, как на рисунке. Как подсчитать количество элементов в списке, которые перемещаются вверх или вниз пользователем? Если этот элемент после нескольких движений от пользователя возвращается в исходный индекс, то он не рассматривается как движение. Я подсчитал количество изменений индекса на несколько вариантов, но они включают подсчет движений, а не от пользователя. Я бы добавил свойство Bool «Перенос пользователем» в класс MyItem, но я хотел бы увидеть, есть ли способ избежать его. < /P>

Код: Выделить всё

class MyItem
{
public string MyName { get; set; }
public string SomeOtherProperties { get; set; }
public MyItem() { MyName = ""; }
}
List ListMyItems = new List(){MyItem1, MyItem3, MyItem2 ... }
List ListMyItemsOriginal = new List(){MyItem1, MyItem2, MyItem3, ... }

int iMovedUpOrDown1 = ListMyItems
.Select((current, index) => new { MyItem = current, CurrentIndex = index })
.Join(
ListMyItemsOriginal.Select((original, index) => new { MyItem = original, OriginalIndex = index }),
c => c.MyItem.MyName,
o => o.MyItem.MyName,
(c, o) => new { c.MyItem, IndexChanged = c.CurrentIndex != o.OriginalIndex })
.Where(x => x.IndexChanged)
.Select(x => x.MyItem).Count();

var originalIndices2 = ListMyItemsOriginal
.Select((MyItem, index) => new { MyItem.MyName, Index = index })
.ToDictionary(x => x.MyName, x => x.Index);
int iMovedUpOrDown2 = ListMyItems
.Select((current, index) => new { current, CurrentIndex = index })
.Where(x =>
originalIndices3.TryGetValue(x.current.MyName, out int originalIndex) &&
x.CurrentIndex != originalIndex)
.Select(x => x.current).Count();

var originalIndices = new Dictionary();
for (int i = 0; i < ListMyItemsOriginal.Count; i++)
originalIndices[ListMyItemsOriginal[i].MyName] = i;

var listMovedUpOrDown3 = new List();
for (int i = 0; i < ListMyItems.Count; i++)
{
var current = ListMyItems[i];
if (originalIndices.TryGetValue(current.MyName, out int originalIndex) && originalIndex != i)
result4.Add(current);
}
int iMovedUpOrDown3 = listMovedUpOrDown3.Count();
< /code>
Примеры исходных и измененных списков и количество изменений, которые должны быть: < /p>
1.
D moved down one time

original list: A,B,C,D,E,F,H,I,J
changed list:  A,B,C,E,D,F,H,I,J

the count should be 1
< /code>

 < /li>
< /ol>
D moved down two times

original list: A,B,C,D,E,F,H,I,J
changed list:  A,B,C,E,F,D,H,I,J

the count should be 1
< /code>

 < /li>
< /ol>
E moved down one time, D moved down one time

original list: A,B,C,D,E,F,H,I,J
changed list:  A,B,C,F,D,E,D,I,J

the count should be 2
< /code>
4 < /p>
E moved down one time, D moved down one time

original list: A,B,C,D,E,F,H,I,J
changed list:  A,B,C,F,D,E,H,I,J

the count should be 2


Подробнее здесь: https://stackoverflow.com/questions/796 ... up-or-down
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»