基于另一个列表中的相关值对c#中的列表进行排序

时间:2015-02-18 15:42:28

标签: c# sorting

我试图根据另一个列表中出现的顺序对项目列表进行排序。

以下是基本结构:

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;
    }

2 个答案:

答案 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