繁体   English   中英

使用linq在C#的列表中查找最接近和更小的值?

[英]Find closest and smaller value in a list in C# with linq?

我有一个这样的清单:

public List<Dictionary<int, int>> blanks { get; set; }

这保留了一些索引值:

在此处输入图片说明

此外,我还有一个名为X的变量。X可以取任何值。 我想找到最接近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);                                            

更改

Diff = Math.Abs(item - X)

Diff = X - item

接着

var closestDiffS = diffSecond.Aggregate((agg, item) => (item.Diff > 0 && item.Diff < agg.Diff) ? item : agg);

或者,您需要一个位置。 我认为应该去这里:

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM