我有一个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中的结果相同,而不是它自己的随机顺序。
有什么想法吗?
答案 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"]]);