这是名单。最后,我们必须有6个项目在其中。
List<KeyValuePair<Element, int» myList = new List<KeyValuePair<Element, int»();这样做是行不通的:
foreach (KeyValuePair<Element, int> i in myList)
if (i.Value - [i- 1].Value == 1)
{
//
}这个也是。它只给出一个项目:
List<KeyValuePair<Element, int>> filteredList = new List<KeyValuePair<Element, int>>();
for (int i = 1; i < myList.Count; i++)
{
if ((myList[i].Value - myList[i - 1].Value) == 1)
{
filteredList.Add(myList[i - 1]);
}
}现在的列表是这样的:
[Autodesk.Revit.DB.Architecture.Room, 2],
[Autodesk.Revit.DB.Architecture.Room, 2],
[Autodesk.Revit.DB.Architecture.Room, 2],
[Autodesk.Revit.DB.Architecture.Room, 2],
[Autodesk.Revit.DB.Architecture.Room, 2],
[Autodesk.Revit.DB.Architecture.Room, 2],
[Autodesk.Revit.DB.Architecture.Room, 7],
[Autodesk.Revit.DB.Architecture.Room, 7],
[Autodesk.Revit.DB.Architecture.Room, 7],
[Autodesk.Revit.DB.Architecture.Room, 7],
[Autodesk.Revit.DB.Architecture.Room, 7],
[Autodesk.Revit.DB.Architecture.Room, 7],
[Autodesk.Revit.DB.Architecture.Room, 8],
[Autodesk.Revit.DB.Architecture.Room, 8],
[Autodesk.Revit.DB.Architecture.Room, 8],
[Autodesk.Revit.DB.Architecture.Room, 8],
[Autodesk.Revit.DB.Architecture.Room, 8],
[Autodesk.Revit.DB.Architecture.Room, 8]发布于 2022-01-20 02:22:23
下面是一个使用Linq的一线解决方案:
var filtered = myList.Select(kvp => kvp.Value).Distinct().Select(v => myList.First(kvp => kvp.Value == v)).ToList();请记住,这个解决方案是O(N^2),这个问题可以很容易地解决O(N),但是考虑到列表的大小,这并不重要。
下面是一个更具人类可读性的解决方案: O(N):
var dictionary = new Dictionary<int, Room>();
foreach (var (key,value) in myList)
{
if (!dictionary.ContainsKey(value)) dictionary[value] = key;
}
var filtered = dictionary.Select(kvp => new KeyValuePair<Room, int>(kvp.Value, kvp.Key)).ToList();https://stackoverflow.com/questions/70778759
复制相似问题