Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IComparer按另一个列表对具有自定义对象的列表进行排序_C#_.net_List_Interface_Icomparer - Fatal编程技术网

C# 使用IComparer按另一个列表对具有自定义对象的列表进行排序

C# 使用IComparer按另一个列表对具有自定义对象的列表进行排序,c#,.net,list,interface,icomparer,C#,.net,List,Interface,Icomparer,我的问题是关于IComparer界面的,我以前从未使用过它,所以我希望您能帮助我正确设置一切 我必须使用界面按照另一个列表的确切顺序对自己的对象列表进行排序。 我在网上找不到任何对这个问题有用的东西,我找到的所有东西都是linq语句,我不能使用 下面是示例代码: public class What : IComparer<What> { public int ID { get; set; } public string Ever { get; set; }

我的问题是关于
IComparer
界面的,我以前从未使用过它,所以我希望您能帮助我正确设置一切

我必须使用界面按照另一个
列表的确切顺序对自己的对象列表进行排序。
我在网上找不到任何对这个问题有用的东西,我找到的所有东西都是linq语句,我不能使用

下面是示例代码:

public class What : IComparer<What>
{
    public int ID { get; set; }
    public string Ever { get; set; }

    public What(int x_ID, string x_Ever)
    {
        ID = x_ID;
        Ever = x_Ever;
    }

    public int Compare(What x, What y)
    {
        return x.ID.CompareTo(y.ID);
    }
}
公共类什么:IComparer
{
公共int ID{get;set;}
公共字符串Ever{get;set;}
公共内容(int x_ID,字符串x_Ever)
{
ID=x_ID;
Ever=x_Ever;
}
公共整数比较(什么x,什么y)
{
返回x.ID.CompareTo(y.ID);
}
}
要使用的一些数据:

List<What> WhatList = new List<What>()
{
    new What(4, "there"),
    new What(7, "are"), 
    new What(2, "doing"),
    new What(12, "you"),
    new What(78, "Hey"),
    new What(63, "?")
};
List WhatList=newlist()
{
新内容(4,“有”),
新增内容(7,“是”),
新内容(2,“正在做”),
新内容(12,“您”),
新什么(78,“嘿”),
新内容(63,“?”)
};
并以正确的顺序列出:

List<int> OrderByList = new List<int>() { 78, 4, 63, 7, 12, 2 };
List OrderByList=newlist(){78,4,63,7,12,2};
那么现在我如何告诉
IComparer
OrderByList
排序呢?
我真的不知道如何做到这一点,我知道使用linq很容易,但我没有机会使用它。

您的代码目前存在一些问题。如果你看一下,你会发现
T
就是你要比较的内容。在您的代码中,这是
测试
,但您继续编写代码以比较
内容
——这意味着您的代码将无法编译。请参阅-错误消息为:

“Rextester.What‘未实现接口成员’System.Collections.Generic.IComparer.Compare(Rextester.Test,Rextester.Test)’
(忽略此处的“Rextester”位!)

说到做到,您应该实现一个
WhatComparer

public class WhatComparer : IComparer<What>
{
    private List<int> orderBy;
    public WhatComparer(List<int> orderBy)
    {
        this.orderBy = orderBy;
    }

    public int Compare(What x, What y)
    {
        return orderBy.IndexOf(x.ID).CompareTo(orderBy.IndexOf(y.ID));
    }
}

实例:

您应该创建另一个类来进行比较,并给出所需的顺序:

public class OrderComparer : IComparer<What>
{
    private readonly Dictionary<int, int> idIndexes = new Dictionary<int, int>();
    public OrderComparer(List<int> idOrders)
    {
        for(int i = 0; i < idOrders.Length; i++)
        {
            idIndexes[idOrders[i].ID] = i;
        }
    }

    public int Compare(What x, What y)
    {
        return idOrders[x.ID].Compare(idOrders[y.ID]);
    }
}

最简单的方法是使用自定义:


出于兴趣,为什么没有LINQ?假设所有
ID
值都存在于您的
OrderBylist
集中是否安全?谢谢!正是我需要的!
public class OrderComparer : IComparer<What>
{
    private readonly Dictionary<int, int> idIndexes = new Dictionary<int, int>();
    public OrderComparer(List<int> idOrders)
    {
        for(int i = 0; i < idOrders.Length; i++)
        {
            idIndexes[idOrders[i].ID] = i;
        }
    }

    public int Compare(What x, What y)
    {
        return idOrders[x.ID].Compare(idOrders[y.ID]);
    }
}
WhatList.Sort(new OrderComparer(OrderByList));
WhatList.Sort((x, y) =>
{
    return OrderByList.IndexOf(x.ID).CompareTo(orderByList.IndexOf(y.ID));
});