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个成员的类:

  • 字符串名
  • 列出二进制列表
其中,二进制是另一个类

我想根据每个列表项中包含的“名称”对“ConfigList”列表进行排序

有人能给我引路吗

此外,我还想使用“Name”子字符串进行排序,因为“Name”将包含“Week 07”、“Week 09”等值,其中用于比较的子字符串是字符串的数字部分(例如“07”、“09”等)

如果实现该接口,您可以准确地决定自定义对象的排序方式

返回正整数(如1)将向前叠加,返回负整数(如-1)将向后叠加

编辑:

代码可能如下所示:

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