2010-09-28 84 views
1

我基本上有一张表头,我用C#中的linq读取数据库中的表头。在这些标题中,总是至少有一个总是相同的;总计,我希望它总是在正确的位置。Linq OrderBy属性值和组

因此,这里是那种我的数据是如何布局:

Data 
{ 
    Label, 
    Value, 
    Age //Not used initially 
} 

样本数据:

{"Dog", 7} 
{"Cat", 3} 
{"Other", 4} 
{"Total", 14} 

我想在这个以命令标签;实际的动物名称按降序排序,总数被追加到最后:

"Dog", "Other", "Cat", "Total" 

如何在Linq中执行此操作。我如何根据另一个属性的值来排序属性?

一旦我有了标题的顺序,是否有一种简单的方法可以根据已经确定的顺序对未来的行进行排序。如果我想最初找到标题(x => x.Age> 20) 如何根据与> 20集合相同的顺序将标签排序在哪里(x => x.Age < = 20)?

+0

你为什么总存储?无法计算它,然后只是添加到列表的末尾?然后你可以按年龄降序排序。或者我错过了什么? – jim 2010-09-28 22:35:46

+0

其简化。总数不是实际的属性名称。并不总是可以通过求和来计算。 – Harry 2010-09-28 23:15:12

回答

4

这个查询应该工作:

var query = from row in table 
      let ignore = row.Label == "Total" 
      orderby ignore, row.Value descending 
      select row.Label; 

//and corresponding lambda version 
var lquery = table.OrderBy(row => row.Label == "Total") 
        .ThenByDescending(row => row.Value) 
        .Select(row => row.Label); 

注意:它不是完全必要创建一个ignore变量,它可以直接在排序依据子句中放置。这样,它使它更具可读性。

不确定你在问你第二个问题。


编辑:
在回答您的意见,这将取决于你如何想的分拣工作,至少这样写的。如果表中只有一行需要完全忽略,那么这很有效。如果你有不止一个,那就不要多说了。问题是,在“被忽略”的行中,将按原始排序排序(在这种情况下,按Value)。添加另一行的天真方式是添加到忽略条件。

var query = from row in table 
      let ignore = row.Label == "Total" || row.Label == "Cost" 
      orderby ignore, row.Value descending 
      select row.Label; 

要具备“忽略”行中的特定的顺序,这需要一个较为复杂的查询:

var query = from row in table 
      let ignore = row.Label == "Total" || row.Label == "Cost" 
      let ignoreorder = row.Label == "Cost" ? 1 : 0 
      orderby ignore, ignoreorder, row.Value descending 
      select row.Label; 

//and corresponding lambda version 
var lquery = table.OrderBy(row => row.Label == "Total" || row.Label == "Cost") 
        .ThenBy(row => row.Label == "Cost" ? 1 : 0) 
        .ThenByDescending(row => row.Value) 
        .Select(row => row.Label); 
+0

如果我有超过1个“忽略”列,语法会是什么样子。像总数和成本。我总是希望Cost在被忽略之后。另外,这个样子的lambda表达式语法是什么样的?这解决了我的第一个问题。谢谢。我会研究第二个问题,也许在另一个问题上进一步澄清。 – Harry 2010-09-28 23:52:26