我有一个这样的清单:
public List<Dictionary<int, int>> blanks { get; set; }
保留一些索引值:
另外我还有一个名为X的变量.X可以取任何值。我想找到最接近和较小的'Key'值到X.我只能通过这个代码块获取最接近的值。但是,它不能采取更小的。
var diffs = kaynaklarArray[l].blanks.SelectMany((item, index) => item.Select(entry => new { Index = index, Key = entry.Key, Diff = Math.Abs(entry.Key - X) })).OrderBy(item => item.Diff);
var closestDiff = diffs.First();
var key = closestDiff.Key;
var value = (kaynaklarArray[l].blanks[closestDiff.Index])[closestDiff.Key];
如果X是1000,我想取空白索引:1和密钥:750,因为它比X小。但是这个代码块需要索引:2和密钥:1200。我不想要它。
我该怎么做?
另外我还有一个像这样的列表:
List<List<int[]>> lastList = new List<List<int[]>>();
这一次,我想先获取List的索引和第二个List的索引。例如,如果X是800,我想取0和0(索引0),也取1和1(索引1)。
同样,我有代码块。但它不能采取更小的一个。它需要最接近的一个。
var diffSecond = lastList.SelectMany((listS, listIndex) => listS.
SelectMany((array, arrayIndex) => array.Select((item, itemIndex) => new
{
ListIndex = listIndex,
ArrayIndex = arrayIndex,
ItemIndex = itemIndex,
Diff = Math.Abs(item - X)
})));
var closestDiffS = diffSecond.Aggregate((agg, item) => (item.Diff < agg.Diff) ? item : agg);
答案 0 :(得分:0)
更改
Diff = Math.Abs(item - X)
到
Diff = X - item
然后
var closestDiffS = diffSecond.Aggregate((agg, item) => (item.Diff > 0 && item.Diff < agg.Diff) ? item : agg);
或者,你需要一个Where。我认为应该去这里:
var diffSecond = lastList.SelectMany((listS, listIndex) => listS.
SelectMany((array, arrayIndex) => array //Not here, 'cause you need the index
.Select((item, itemIndex) => new
{
ListIndex = listIndex,
ArrayIndex = arrayIndex,
ItemIndex = itemIndex,
Diff = X - item
}).Where(item => item.Diff > 0)
));
获取具有最小Diff的所有列表:
var closestDiffS = diffSecond.GroupBy(item => item.Diff).OrderBy(group => group.Key).FirstOrDefault();