如何按照不同字符串列表中请求的顺序排序()



如何使用OrderBy按照请求的不同列表以相同的顺序形成输出

public DataCollectionList GetLatestDataCollection(List<string> requestedDataPointList)
{
var dataPoints = _context.DataPoints.Where(c => requestedDataPointList.Contains(c.dataPointName))
.OrderBy(----------)  //TODO: RE-ORDER IN THE SAME ORDER AS REQUESTED requestedDataPointList
.ToList();        


dataPoints.ForEach(dp => 
{
....
});
}

在客户端进行排序:

public DataCollectionList GetLatestDataCollection(List<string> requestedDataPointList)
{
var dataPoints = _context.DataPoints.Where(c => requestedDataPointList.Contains(c.dataPointName))
.AsEnumerable()
.OrderBy(requestedDataPointList.IndexOf(c.dataPointName));        

foreach (var dp in dataPoints)
{
....
});
}

注意:另外,我不认为ToList().ForEach()foreach ()更好。

它认为最快的方法是将结果与请求列表连接起来。这利用了LINQ的join保留第一个列表的排序顺序的事实:

var dataPoints = _context.DataPoints
.Where(c => requestedDataPointList.Contains(c.dataPointName))
.ToList();
var ordered = from n in requestedDataPointList
join dp in dataPoints on n equals dp.dataPointName
select dp;
foreach (var dataPoint in ordered)
{
...
}

这不涉及任何排序,连接完成所有操作,这将接近O(n(。

另一种快速方法是创建一个序列号字典:

var indexes = requestedDataPointList
.Select((n, i) => new { n, i }).ToDictionary(x => x.n, x => x.i);
var ordered = dataPoints.OrderBy(dp => indexes[dp.dataPointName]);

最新更新