C# 根据列表项和自定义条件对列表进行排序
我有一个列表,其中包含一个字符串和另一个列表-示例代码如下:C# 根据列表项和自定义条件对列表进行排序,c#,list,sorting,element,C#,List,Sorting,Element,我有一个列表,其中包含一个字符串和另一个列表-示例代码如下: List<Config> ConfigLists; 列表配置列表; 这里的Config是一个包含2个成员的类: 字符串名 列出二进制列表 其中,二进制是另一个类 我想根据每个列表项中包含的“名称”对“ConfigList”列表进行排序 有人能给我引路吗 此外,我还想使用“Name”子字符串进行排序,因为“Name”将包含“Week 07”、“Week 09”等值,其中用于比较的子字符串是字符串的数字部分(例如“0
List<Config> ConfigLists;
列表配置列表;
这里的Config是一个包含2个成员的类:
- 字符串名
- 列出二进制列表
public class Config : IComparable
{
public string Name { get; set; }
// other properties
public int CompareTo(object obj) {
if (obj == null) return 1;
Config otherConfig = obj as Config;
if (otherConfig != null)
// this is where you would place the compare logic
else
throw new ArgumentException("Object is not a Config");
}
}
使用这种解决方案,您必须在某个时候调用list.sort()。如果您追求的是效率,那么您可能希望在运行过程中保持集合的有序(分散排序时间)。解释执行此操作的选项。Linq在这里应该有所帮助
// using System.Linq;
ConfigLists = ConfigLists.OrderBy(x => x.Name).ToList();
…这当然可以用来按子字符串排序
// Skips "Week ";
// using System.Linq;
ConfigLists = ConfigLists.OrderBy(x => x.Name.Substring(5)).ToList();
如果您有更复杂的排序顺序,或者希望在排序时避免使用临时字符串,您可以使用IComparer为您进行排序
class WeekComparer : IComparer<Config>
{
public int Compare(Config x, Config y)
{
return string.Compare(x.Name, 5, y.Name, 5, int.MaxValue);
}
}
// using System.Linq;
var weekComparer = new WeekComparer();
ConfigLists = ConfigLists.OrderBy(x => x, weekComparer).ToList();
只需将委托传递给Sort()成员函数,如下所示:
List<Config> ConfigLists;
//...
ConfigLists.Sort((c1,c2) =>
int.Parse(c1.Name.Substring(5)) - int.Parse(c2.Name.Substring(5)));
列表配置列表;
//...
ConfigLists.Sort((c1,c2)=>
int.Parse(c1.Name.Substring(5))-int.Parse(c2.Name.Substring(5));
你能给我举个类似的例子吗?那太好了。我的问题也是如何在C#中有效地使用Icomparable和Comparer?
List<Config> ConfigLists;
//...
ConfigLists.Sort((c1,c2) =>
int.Parse(c1.Name.Substring(5)) - int.Parse(c2.Name.Substring(5)));