LINQ包含查询自定义排序

时间:2012-10-19 14:04:32

标签: c# linq

我有一个LINQ查询,它可以获取代码包含在列表中的所有结果。这工作正常,但我需要按照代码列表保持顺序。因此,当返回EnumerableRowCollection时,行的顺序与tehy在List中的顺序相同。

这是我目前的代码:

if (productcodes != "")
{
    string[] pcodes = productcodes.Split('|');

    // Get most recently viewed first
    Array.Reverse(pcodes);

    List<int> prodCodes = new List<int>();

    foreach (string pc in pcodes)
    {
        if (pc != "")
        {
            prodCodes.Add(Convert.ToInt32(pc));
        }
    }

    results = results.Where(d => d["ProductCode"] != DBNull.Value && (int)d["ID"] > 0 && prodCodes.Contains((int)d["ProductCode"])).Select(d => d);
}

所以我需要将EnumerableRowCollection结果与List prodCodes中的结果相同,而不是它自己的随机顺序。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这就是你所需要的:

IEnumerable<int> pcodes = productcodes.Split('|')
   .Where(s => !string.IsNullOrWhiteSpace(s))
   .Select(s => int.Parse(s))
   .Reverse();

var result = from code in pcodes
             join row in results on code equals row.Field<int>("ProductCode")
             select row;

最后的连接按照第一个序列(pcodes)的顺序排列,只包含ProductCodes的连接在“内连接”上。

答案 1 :(得分:1)

假设prodCodes是唯一的,您可以将它们投影到映射中:

Dictionary<int, int> orderMap = prodCodes
  .Select( (val, i) => new {val, i} )
  .ToDictionary(x => x.val, x => x.i);

然后您可以使用orderMap对结果进行排序:

var results = GetSomeResults();
results = results.OrderBy(row => orderMap[(int)row["ProductCode"]]);