Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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# 基于预定义键的自定义排序_C#_Sorting - Fatal编程技术网

C# 基于预定义键的自定义排序

C# 基于预定义键的自定义排序,c#,sorting,C#,Sorting,我需要根据预定义的uniqueid对员工列表进行排序 简单地说,考虑一个员工ID列表:代码> 1到10的随机顺序。< /代码> < /P> 我有一个预定义的规则,规定按2,8,1,4,6的顺序排列员工对象,如果任何员工UId不在范围[1,10]内,则将其放在列表的末尾…(任意顺序) 我使用IComparer编写了以下代码 公共类员工 { 公共int-UId{get;set;} 公共字符串名称{get;set;} } 类比较:IComparer { 列表引用键=新列表{2,8,1,4,6}; 公共

我需要根据预定义的uniqueid对员工列表进行排序

简单地说,考虑一个员工ID列表:代码> 1到10的随机顺序。< /代码> < /P> 我有一个预定义的规则,规定按
2,8,1,4,6
的顺序排列员工对象,如果任何员工UId不在范围[1,10]内,则将其放在列表的末尾…(任意顺序)

我使用
IComparer
编写了以下代码

公共类员工
{
公共int-UId{get;set;}
公共字符串名称{get;set;}
}
类比较:IComparer
{
列表引用键=新列表{2,8,1,4,6};
公共int比较(员工thisOne,员工otherOne)
{
var otherIndex=referenceKeys.IndexOf(otherOne.UId);
var thisIndex=referenceKeys.IndexOf(thisOne.UId);
如果(此索引>其他索引)
{
返回1;
}
else if(此索引<其他索引)
{
返回-1;
}
其他的
{
//如果在参考列表中未找到uid,则将两个员工对象视为相等
返回0;
}
}
}
类自定义排序
{
公共静电
列出员工=新名单
{
新员工{UId=1,Name=“Ram”},
新员工{UId=2,Name=“Shyam”},
新员工{UId=3,Name=“Krishna”},
新员工{UId=4,Name=“Gopal”},
新员工{UId=5,Name=“Yadav”},
新雇员{UId=6,Name=“Vishnu”},
新员工{UId=7,Name=“Hari”},
新员工{UId=8,Name=“Kanha”},
};
空排序()
{
employees.Sort(newcomparison());
}
静态void Main()
{
新建CustomSorting().sort();
}
}
我已经能够对列表进行排序,结果如下-

(5,7,3)、2,8,1,4,6
=>5,7,3未列在参考键中,因此应以最后的顺序出现

但在我的参考键中找不到的项目将首先排序。我需要把它们放在最后


对于这种情况,最好的方法是使用
IComparer
var-otherIndex=referenceKeys.IndexOf(otherOne.UId)将返回
-1
,该值将小于任何找到的值

您希望所有未找到的项都大于任何已找到的值,因此只需添加:

if(otherIndex == -1) otherIndex = int.MaxValue;
if(thisIndex == -1) thisIndex = int.MaxValue;
另一方面,您可以使用以下方法简化该方法的其余部分:

return thisIndex.CompareTo(otherIndex);

var otherIndex=referenceKeys.IndexOf(otherOne.UId)将返回
-1
,该值将小于任何找到的值

您希望所有未找到的项都大于任何已找到的值,因此只需添加:

if(otherIndex == -1) otherIndex = int.MaxValue;
if(thisIndex == -1) thisIndex = int.MaxValue;
另一方面,您可以使用以下方法简化该方法的其余部分:

return thisIndex.CompareTo(otherIndex);

当找不到项目时,应该是
=
而不是
=
。。其他索引将是-1,但返回值将取决于对
var thisIndex=referenceKeys.IndexOf(thisOne.UId)的求值。返回int.MaxValue实际上没有帮助,它混淆了不需要的Id。为示例运行生成的输出是。。(7) 2 8 (5) (3) 1 4 6. ...括号中的项目应该出现在最后。我运行了这段代码,得到:
281463557
。您说“Returning int.MaxValue”,但不应该返回
int.MaxValue
,您应该将每个索引设置为最大值。您只需在声明两个索引变量之后(在
if
语句之前),将我必须的两行代码复制/粘贴到
Compare
方法中。如果需要,您可以用我提供的第三行代码替换
If/else If/else
块。如果找不到项,应该是
=
而不是
=
。。其他索引将是-1,但返回值将取决于对
var thisIndex=referenceKeys.IndexOf(thisOne.UId)的求值。返回int.MaxValue实际上没有帮助,它混淆了不需要的Id。为示例运行生成的输出是。。(7) 2 8 (5) (3) 1 4 6. ...括号中的项目应该出现在最后。我运行了这段代码,得到:
281463557
。您说“Returning int.MaxValue”,但不应该返回
int.MaxValue
,您应该将每个索引设置为最大值。您只需在声明两个索引变量之后(在
if
语句之前),将我必须的两行代码复制/粘贴到
Compare
方法中。如果需要,可以用我提供的第三行代码替换
If/else If/else
块。