Asp.net gridview 按年龄排序

Asp.net gridview Sorting by age

我有一个包含“年龄”列的 table,其中排序后的年龄显示如下:

10 years,
105 years
18 years,
60 years.
8 months.

我怎样才能不按字母顺序排序,而是正确排序。 我无法消除“年”字。

嗯,如果这是来自数据库?

那么你可以这样做:

SELECT id, FirstName, LastName, Age, 
  cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer) as NumAge
  FROM tblCustomers
  ORDER BY NumAge

所以,现在您有一个文本显示列,但您还有一个真实的“数字”列,其中包含以年为单位的实际数字 - 您可以在该 NumAge 列上正确排序。这种排序也可以通过数据视图排序来完成 - 因此,无论您如何 were/are 对数据进行排序,如果您添加从该列中提取数字的上述列,则按 NumAge 排序将成为一个可能的选择。

现在如果我们不混合使用月份和年份,上面的方法就可以工作了。但是,为了处理这个问题,我们将上面的内容更改为:

SELECT id, FirstName, LastName, Age, 
    CASE
      WHEN CharIndex('month',Age) > 0 THEN
        (cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) as integer))
      WHEN CharIndex('year',Age) > 0 THEN
        (cast(SUBSTRING(Age,1,Charindex(' ',Age)-1 ) * 12 as integer))
    END 
     AS AgeInMonths
  FROM tblCustomers
  ORDER BY AgeInMonths

因此,我们现在再次有了一个数字和以月为单位的年龄值,并且可以对其进行排序。所以我们显示年龄+文本列,但是排序表达式可以使用AgeInMonths,结果是正确顺序的数据。

如果你有时间呢?然后我会用月 * 12 代替月 * 30,而对于年,则只使用 * 365。因此,支持年、月或日并不难。

结果再次是,数据按给定年龄按数字顺序排序。

问题也是“个”。 8 个月大于 2 年还是 8 个月大于 0 年? 如果是最后一个,您可以使用 Linq。 让我们说这是年龄。

var age = new List<string>()
{
    "10 years,",
    "105 years",
    "18 years,",
    "60 years.",
    "8 months.",
    "1 year.",
    "18 months,",
 };

那你就可以这样做了。它按月和年拆分列表。然后删除除数字以外的所有字符。如果是一个月,则除以 12 得到年份。然后排序,重新做成字符串,加上"years"。

var sortedAge = age.Where(x => x.ToLower().Contains("month"))
   .Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit))) / 12)
   .Concat(age.Where(x => x.ToLower().Contains("year"))
   .Select(x => Convert.ToInt32(string.Concat(x.Where(Char.IsDigit)))))
   .OrderBy(y => y)
   .Select(z => z > 1 ? z.ToString() + " years" : z.ToString() + " year").ToList();

结果

0 year
1 year
1 year
10 years
18 years
60 years
105 years

但是您最好还是将年龄作为 int 存储在 DOB 中,或者更好的是,将出生日期存储为 datetime。