所以這不是我承認的,也許你們中的一些人可以幫助我。
我有一個包含 2 列的串列。如您在示例中所見,myList 將很短,并且第一列已排序。
private List<(double,double)> myList = new List<(double column1, double column2)> {
(6,80),
(8,107),
(10,134),
(12,160),
(16,214),
(20,267),
(25,334),
(32,427),
(40,534)
};
我需要做的是,給定一個數字,假設為 24。從元組串列中搜索下一個最接近的值并回傳正確的元組。所以它應該回傳 (25,334)。
如果目標是 21,則所需的結果是(25,334)。
我的第一種方法是使用串列,因為我將來可能會添加一些值。但是,如果您知道任何一種可以更好地適應這種用法的結構,請隨意提出。
提前致謝
uj5u.com熱心網友回復:
如果串列已排序,您可以使用
var (x, y) = myList.FirstOrDefault(t => t.Item1 >= 24);
如果沒有找到這樣的元素,x則將是0,否則將是所需的值(x = 25在本例中為 and y = 334)。
uj5u.com熱心網友回復:
鑒于您的元組串列已排序,您可以使用二進制搜索來查找匹配或跟隨目標的專案的索引。這具有O(Log(N))復雜性,因此非常有效:
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
static class Program
{
public static void Main()
{
List<(double, double)> myList = new List<(double column1, double column2)> {
(6,80),
(8,107),
(10,134),
(12,160),
(16,214),
(20,267),
(25,334),
(32,427),
(40,534)
};
double target = 24;
int index = myList.BinarySearch(
(target, 0),
Comparer<(double, double)>.Create(
(lhs, rhs) => lhs.Item1.CompareTo(rhs.Item1)) );
if (index < 0)
index = ~index;
if (index < myList.Count)
Console.WriteLine($"Found at index {index}, value = {myList[index]}");
else
Console.WriteLine("Not found");
}
}
}
在 DotNetFiddle 上試試
BinarySearch()如果未找到該專案,則回傳索引的方式有點繁瑣。在那種情況下它將是負數,并且您必須按位不獲取下一個值的索引。不要為此責備我。;)
另一個繁瑣的地方是您只搜索元組中的第一項,因此第二項實際上被忽略了。
最后,如果未找到該專案,則索引將超出串列末尾,因此您也必須考慮這一點。
uj5u.com熱心網友回復:
從串列中找到最接近的值:
var result=myList.OrderBy(item => Math.Abs(number - item.Item1)).First();
從串列中找到下一個最接近的值:
var result = myList.First(item => item.Item1-number>=0);
uj5u.com熱心網友回復:
你們中的一個人回答了我的問題,然后洗掉了帖子。我不是解決方案的作者!
double target = 21;
var closest = myList.MinBy(item => Math.Abs(item.Item1 - target));
double resultValue = closest.Item2;
結果值為 334。
這就是我想要做的,而且只有一行。美麗的
謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517307.html
標籤:C#列表元组
上一篇:C#中對陣列的SQL選擇
下一篇:覆寫文本檔案的第一行(c#)
