我试图根据另一个列表中出现的顺序对项目列表进行排序。
以下是基本结构:
public class ItemList
{
public List<Item> items;
public ItemList(string myValue)
{
items = new List<Item>();
}
public void addItem (string myValue)
{
var newItem = new Item(myValue);
items.Add(newItem);
}
public class Item
{
public List<string> myLinkedValues;
public string myValue;
public Item(string myValue)
{
myLinkedValues = new List<string>();
}
public void addLinkedItem(string linkedItem)
{
myLinkedValues.Add(linkedItem);
}
}
}
因此,如果我的列表具有以下值(myValue和myLinkedValues):
A
C
B
A C
C
D
C B
我试图对其进行排序,因此依赖值首先是这样的:
C
A
C
B
A C
D
C B
基本上我这样做的方式很慢,所以我想知道是否有更快的方法来做到这一点。
编辑,我的基础知识:
public void Sort()
{
var changed = true;
while (changed)
{
changed = false;
var sortedList = new List<Item>();
foreach (Item item in items)
{
var minimumPosition = -1;
var parents = Linked.FindAll(myList => myList.isLinked(item.myValue);
foreach (Item parent in parents)
{
var parentPosition = sortedList.IndexOf(parent);
if (minimumPosition == -1 || (parentPosition < minimumPosition && parentPosition != -1))
{
minimumPosition = parentPosition;
}
}
if (minimumPosition == -1)
{
sortedList.Add(item);
}
else
{
sortedList.Insert(minimumPosition, item);
changed = true;
}
}
items = sortedList;
}
}
public bool isLinked(string myValue)
{
var isLinked = false;
isLinked = items.Any(check => check == myValue;
return isLinked;
}
答案 0 :(得分:0)
为了比较两个序列,我们首先需要创建一个可以比较序列的比较器。这样做相当简单。尝试从两个序列中获取下一个项目,如果没有另一个项目,则序列相等,如果一个已经结束而另一个没有“#34; less&#34;比另一个,如果两个都有另一个项目,然后比较这些项目,如果他们相同的继续循环。
public class SequenceComparer<T> : IComparer<IEnumerable<T>>
{
private IComparer<T> comparer;
public SequenceComparer(IComparer<T> compareer = null)
{
this.comparer = comparer ?? Comparer<T>.Default;
}
public int Compare(IEnumerable<T> x, IEnumerable<T> y)
{
using (var first = x.GetEnumerator())
using (var second = x.GetEnumerator())
{
while (true)
{
var firstHasMore = first.MoveNext();
var secondHasMore = second.MoveNext();
if (!firstHasMore && !secondHasMore)
return 0;
var lengthComparison = firstHasMore.CompareTo(secondHasMore);
if (lengthComparison != 0)
return lengthComparison;
var nextComparison = comparer.Compare(first.Current, second.Current);
if (nextComparison != 0)
return nextComparison;
}
}
}
}
通过这种比较器排序,列表非常简单:
var sorted = items.OrderBy(item => item.myLinkedValues,
new SequenceComparer<string>());
答案 1 :(得分:0)
如果我错误地理解了你的要求,试试这个并对不起。
将以下内容视为具有字符串列表的依赖集合。
List<string> dependentCollection= new List<string>{ "A","B" "C", "D", "E","F","G"};
这是您原来的收藏品
List<string> myValues = new List<string>{"C","G","B","A"};
var sortedList= myValues.OrderBy(i => dependentCollection.IndexOf(i.ToString()));
输出如下,
A B C G