C# 基于预定义键的自定义排序
我需要根据预定义的uniqueid对员工列表进行排序 简单地说,考虑一个员工ID列表:代码> 1到10的随机顺序。< /代码> < /P> 我有一个预定义的规则,规定按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}; 公共
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)如果找不到项,code>将返回-1
,该值将小于任何找到的值
您希望所有未找到的项都大于任何已找到的值,因此只需添加:
if(otherIndex == -1) otherIndex = int.MaxValue;
if(thisIndex == -1) thisIndex = int.MaxValue;
另一方面,您可以使用以下方法简化该方法的其余部分:
return thisIndex.CompareTo(otherIndex);
var otherIndex=referenceKeys.IndexOf(otherOne.UId)如果找不到项,code>将返回-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
块。