2

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

这是我当前的代码:

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 中的排序相同,而不是它自己的随机顺序。

有任何想法吗?

4

2 回答 2

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;

最后的连接按照第一个序列(pcode)的顺序,并且仅包含ProductCodes在“内部连接”上连接。

于 2012-10-19T14:13:20.063 回答
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"]]);
于 2012-10-19T14:15:29.607 回答