2012-04-19 65 views
4

我有一个List<int> allIDs包含它的原始顺序的ID列表。我正在创建一个元素选择器,该元素选择器允许用户将此列表中的ID添加到另一个List<int> selectedIDs中,并将其从中移除。现在,我完成了所有工作,但每当用户删除并随后添加相同的元素时,它都会添加到列表的末尾(selectedIDs.Add(id))。如何将列表与C#中的现有列表进行比较?

我想插入元素到原来的位置,使用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... } 

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

+0

你有没有反对使用[SortedList Class](http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx)? – 2012-04-19 14:55:29

+4

该名单显然不排序开始... – 2012-04-19 14:56:19

+0

@JacekGorgoń男子,不是我的阅读问题的一天。 :( – 2012-04-19 14:57:06

回答

5

,如果我理解正确的话你的要求:

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

这将通过每个ID在原有的完整列表中的索引顺序选择ID的列表。

+0

经过大量测试后,此功能在9种情况下都能正常工作,但有些项目仍然被添加到列表顶部,没有应用任何排序 – 2012-04-30 12:07:50

+1

@KrisSelbekk:如果你可以重现它,你应该问一个新的问题,这对其他人也许是有趣的。你能举一个例子吗?你确定原因不是[LINQ的延期执行](https:// msmvps.com/blogs/jon_skeet/archive/2008/02/28/implementing-deferred-execution-and-a-potential-trap-to-avoid.aspx)?你可以通过调用'ToList()'方便地绕过结束。 – 2012-04-30 12:15:27

1

在伪代码:

看在第一列表索引你的元素。

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

Else index = x;

取index = x - 1的元素;

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

否则,与索引x元素再次循环 - 2,如果x - 2> = 0

你会最终得到元素的索引之前已经包含在列表中,你将插入您的新元素在此索引+ 1.

1

如果您使用SortedDictionary而不是List?关键是索引,值就是ID。

1

一个选项可能是List<MyClass>而不是List<int>。 MyClass将有两个属性,intbool shouldDisplay。而不是从第一个列表中删除项目,你可以将它们标记为隐藏或不显示。要取消它们,只需将它们设置为“可见”即可。

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(); 

要复杂得多,但具有更好的计算复杂度。

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顺序号进行排序。

相关问题