Мне нужно сосчитать только те элементы, которые перемещаются пользователем, исключая элементы, которые изменили индексы только потому, что другие объекты подталкивали их вверх или вниз. «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