【问题标题】:Find closest and smaller value in a list in C# with linq?使用linq在C#中的列表中查找最接近和更小的值?
【发布时间】:2014-11-20 03:57:11
【问题描述】:

我有一个这样的列表:

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,我想取空白 index:1 和 Key:750,因为它比 X 小。但是这个代码块需要 index:2 和 Key: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);                                            

【问题讨论】:

  • 在某处添加 Where(item
  • @Xaruth 因为那个问题的 cmets 太泛滥了,所以我创建了一个新问题。
  • @Dennis_E 是对的。您的代码正在执行您想要的操作。您需要使用某种位置来限制它。在选择之前或之后......但肯定在 First() 之前
  • 我应该放在哪里?

标签: c# linq dictionary indexing


【解决方案1】:

改变

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

【讨论】:

  • 谢谢。我的第一个有字典的问题有什么解决方案?
  • 基本上一样。 var diffs = kaynaklarArray[l].blanks.SelectMany((item, index) =&gt; item.Select(entry =&gt; new { Index = index, Key = entry.Key, Diff = X - entry.Key }).Where(item =&gt; item.Diff &gt; 0)).OrderBy(item =&gt; item.Diff);
  • 您的答案的第二个解决方案和上面的示例代码给出了“项目”的错误:i.imgur.com/k2lTTMd.png
  • 我认为您缺少括号(在 Where? 之后)
  • 如果所有键都大于 X,则 diffs 将为空,diffs.First(); 会给您该错误。调试你的程序。我没有足够的信息。
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2020-02-13
  • 2015-07-26
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多