【发布时间】:2014-03-18 11:38:33
【问题描述】:
我有一组线条。每行都是字段的集合。很容易找到第 1 列并按其内容排序:
_lines = lines.OrderBy(l => l.Fields.Find(f => f.ColumnNumber == 1).Content).ToList();
但是我如何对这个列表的一个子集进行排序呢?我想按 f.ColumnNumber == 3 排序,其中 (f.ColumnNumber == 1).Content 为 6。
所以我的线条集合看起来像这样:
Col1, Col2, Col3
1, data, data
5, data, data
6, data, Chuck
6, data, Chuck
6, data, Jeffster
6, data, Jeffster
6, data, Grunke
6, data, Gertrude
8, data, data
9, data, data
我想按 col1 排序,然后只排序 col1 == 6 的 col1,但按 col3 排序。
有没有办法在 c# 中做到这一点?我似乎找不到神奇的公式。
编辑:
我的示例数据有点过于简化了。有些行有 3 列,其他行有更多或更少的列。因此,当我使用 .ThenBy 扩展时,如果我试图对 col 3 上的行进行子排序但说第 9 行只有一列,我会得到一个对象引用,它没有设置为对象异常的实例。
这是一个更好的示例数据示例:
Col1, Col2, Col3, Col4
1, data, data, data
5, data, data
6, data, Chuck
6, data, Chuck
6, data, Jeffster
6, data, Jeffster
6, data, Grunke
6, data, Gertrude
8, data, data
9, data
Code 1 lines have 4 columns.
Code 5 lines have 3.
Code 6 lines have 3 - and I need to sort by col 3 alphabetically.
Code 8 lines have 3 columns.
Code 9 lines have 2.
无法保证列表完全排序。所以我首先需要按第一列 1-9 对行进行排序,然后我只需要按列 3 对代码 6 进行排序。
编辑 2:
我的类结构有点复杂,所以我尽量保持简单,希望它就足够了,但看起来他的情况并非如此,所以让我与你分享一下类定义:
public class Field : IField
{
public FieldSpecification Specification { get; set; }
public string Content { get; set; }
}
public class FieldSpecification
{
public int ColumnNumber { get; set; }
public int Length { get; set; }
public int StartPosition { get; set; }
public int EndPosition { get { return StartPosition + Length - 1; } }
public Justification Justification { get; set; }
public char PadCharacter { get; set; }
}
那我有一堆符合ILine接口的行
public interface ILine
{
List<IField> Fields { get; set; }
int Credits { get; }
int Debits { get; }
BigInteger Hash { get; }
}
所以从技术上讲,我在上面显示了类似 field.ColumnNumber,但它应该是 field.Specification.ColumnNumber。
目标是根据可以更改的规范构建固定宽度的文件。所以每一行都有一个带有规范的字段集合,然后数据可以进入内容,规范可以帮助做验证:格式化验证。
我希望有一种方法可以使用 linq 对列表子集进行排序,但我可能需要解构我的最终行集合,对其进行排序,然后重新构建集合。我希望避免这种情况。
【问题讨论】:
-
请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。
-
谢谢 Ondrej。我以后一定会这样做的。
-
我认为您不能通过让我们知道您的数据的类定义来帮助我们吗?
-
那么,
Fields是什么类型的? -
不是您的问题,但是...我知道
BigInteger将有助于避免碰撞,但它永远不会像int那样快。你不应该有一个快速的散列但准确的等号。