Gon*_*ght 1 .net c# sorting arraylist icomparer
我有一个包含大量字符串的ArrayList.它需要根据三个字段(基本上是三个子字符串)进行排序,这三个字段是Name,Age和Amt.年龄是第一个子串(位置0-3),名称是第二个(3-6),Amt是最后一个(6-10).这些参数的排序顺序非常重要,如下所示:
首先按名称执行升序排序然后按年龄进行升序排序(实际上在子字符串中更早出现),然后由Amt 按降序排序.而已.
我有这门课
public class ArrComparer : IComparer
{
public int Compare(object x, object y)
{
string left = x.ToString();
string right = y.ToString();
string lhs = left.Substring(3, 6);
string rhs = right.Substring(3, 6);
return lhs.CompareTo(rhs);
}
}
Run Code Online (Sandbox Code Playgroud)
我用来根据一个字段进行排序 - 通过调用名称
RecordList.Sort(new ArrComparer());
Run Code Online (Sandbox Code Playgroud)
这让我可以根据这一个字段正确排序.问题是如何修改此代码以允许我按照正确的顺序并使用正确的asc/desc模式对所有三个AT ONCE进行排序?
任何代码或提示将不胜感激.(顺便说一句,如果你想知道使用泛型List<T>不是这个项目的一个选项).
ArrayList仍然实现IEnumerable,这意味着您可以在linq中使用简单的orderby()和thenby()扩展:
RecordList = new ArrayList(
RecordList.Cast<string>().OrderBy(s => s.Substring(3,3))
.ThenBy(s => int.Parse(s.Substring(0,3)))
.ThenByDescending(s => double.Parse(s.Substring(6,4)))
.ToArray());
Run Code Online (Sandbox Code Playgroud)
表达此方法的其他方法包括构建更复杂的.OrderBy()或使用匿名类型将字符串组合为对象:
RecordList = new ArrayList(
Record.Cast<string>().Select(s => new {source = s, age = int.Parse(s.Substring(0, 3)), name = s.Substring(3,3), amt = double.Parse(s.Substring(6,4))})
.OrderBy(o => o.name)
.ThenBy(o => o.age)
.ThenByDescending(o => o.amt)
.Select(o => o.source).ToArray());
Run Code Online (Sandbox Code Playgroud)
我喜欢这个选项,因为它让你开始考虑对象.正确地玩你的牌,你可以跳过最后一个.选择()投影来保持对象而不是回到字符串,这将节省必须在以后重新解析所有的工作.
如果这些不是一个选项(可能出于同样的原因你不能使用List <T>),很容易修改你现有的比较方法,如下所示:
public class ArrComparer : IComparer
{
public int Compare(object x, object y)
{
int result;
string left = x.ToString();
string right = y.ToString();
string lhs1 = left.Substring(3, 3);
string rhs1 = right.Substring(3, 3);
result = lhs1.CompareTo(rhs1);
if (result == 0)
{
int lhs2 = int.Parse(left.Substring(0,3));
int rhs2 = int.Parse(right.Substring(0,3));
result = lhs2.CompareTo(rhs2);
}
if (result == 0)
{
double lhs3 = double.Parse(left.Substring(6,4));
double rhs3 = double.Parse(right.Substring(6,4));
result = rhs3.CompareTo(lhs3);
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2326 次 |
| 最近记录: |