4

我有一个List<int> allIDs包含原始顺序的 ID 列表。我正在创建一个元素选择器,它允许用户将此列表中的 ID 添加和删除到另一个List<int> selectedIDs. 现在,我已经完成了所有工作,但每当用户删除并稍后添加相同的元素时,它就会被添加到列表的末尾 ( selectedIDs.Add( id ))。

我想将元素插入到它的原始位置,allIDs用作它曾经所在位置的参考。

以下是列表的一些摘录,以将其全部放在上下文中:

List<int> allIDs = new List<int> {10, 11, 9, 155, 12, 299, 15...};
List<int> selectedIDs = new List<int> { 10, 9, 155, 299, 15... }

现在假设我从selectedIDs-list 中删除了 id=299,以便稍后尝试再次添加它。如何在155和之间插入它15?我知道我可以使用该方法在列表中的任何位置插入list.Insert(obj, index),但是如何以最简单的方式以编程方式执行此操作?

4

6 回答 6

6

如果我正确理解了您的要求:

var ordered = selectedIDs.OrderBy(sID => allIDs.IndexOf(sID));

这将按照原始完整列表中每个 id 的索引对所选 ID 的列表进行排序。

于 2012-04-19T14:57:37.030 回答
1

在伪代码中:

在第一个列表中查找您的元素的索引。

如果此索引为 0,请将您的元素添加到列表的开头。

否则索引 = x;

取 index = x - 1 的元素;

如果索引为 x - 1 的元素在您的列表中,请在之后添加新元素。

否则,如果 x - 2 >= 0,则使用索引 x - 2 处的元素再次循环。

您最终将获得之前已包含在列表中的元素的索引,并且您将在此索引 + 1 处插入新元素。

于 2012-04-19T14:58:33.020 回答
1

如果您使用SortedDictionary而不是 List 怎么样?键是索引,值是 ID。

于 2012-04-19T15:01:01.947 回答
1

一种选择是使用 aList<MyClass>而不是 a List<int>。MyClass 将有两个属性, anintbool shouldDisplay。您可以将它们标记为隐藏或不显示,而不是从第一个列表中删除项目。要取消删除它们,只需将它们再次设置为“可见”即可。

于 2012-04-19T15:05:02.600 回答
1

蒂姆的答案非常紧凑和酷,但有一个非常令人讨厌的复杂性。以下应该在更大的列表上更快,更有用,虽然不是那么紧凑。

public class IdWithFlag
{
     public int Id { get; set; }
     public bool Selected { get; set; }
}

Dictionary<int, IdWithFlag> allIDs = ... // populate somehow, perhaps a custom cast operator would help

现在每次添加/删除选定的 ID 时,重新生成另一个列表,如下所示:

allIDs[currentlyChangedId].Selected = ... // added or removed?

List<int> selectedIDs = allIDs.Values
    .Where(id => id.Selected)
    .Select(id => id.Id)
    .ToList();

复杂得多,但计算复杂度更高。

于 2012-04-19T15:07:11.297 回答
1

这不是最有效的答案,但我认为这是最容易编码的答案:

List<int> allIDs = new List<int> { 10, 11, 9, 155, 12, 299, 15 };
List<int> selectedIDs = new List<int> { 299, 10, 9, 15, 11 };

// this will ensure the sort order...
var newSel = (from a in allIDs
    join s in selectedIDs on a equals s
    select a).ToList();

selectedIDs = newSel;

结果输出将始终根据allIDs数字的顺序进行排序。

于 2012-04-19T15:08:48.487 回答