Существует список объектов типа 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
Существует список объектов типа 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> [code]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