C# 从1项中查找元组列表的索引 请考虑C中的Tuples列表。这与原始元组不值元组有关。如果我知道元组列表中的一个项,如何获取列表的索引 List<Tuple<double, int>> ListOfTuples2 = new List<Tuple<double, int>>(); double doubleTuple = 5000; int intTuple = 7; ListOfTuples2.Add(Tuple.Create(doubleTuple, intTuple)); ListOfTuples2.Add(Tuple.Create(5000.00, 2)); ListOfTuples2.Add(Tuple.Create(5000.25, 3)); ListOfTuples2.Add(Tuple.Create(5000.50, 4)); ListOfTuples2.Add(Tuple.Create(5000.25, 5)); /* How can I get the Index of the List if doubleTuple = 5000.25 ? */

C# 从1项中查找元组列表的索引 请考虑C中的Tuples列表。这与原始元组不值元组有关。如果我知道元组列表中的一个项,如何获取列表的索引 List<Tuple<double, int>> ListOfTuples2 = new List<Tuple<double, int>>(); double doubleTuple = 5000; int intTuple = 7; ListOfTuples2.Add(Tuple.Create(doubleTuple, intTuple)); ListOfTuples2.Add(Tuple.Create(5000.00, 2)); ListOfTuples2.Add(Tuple.Create(5000.25, 3)); ListOfTuples2.Add(Tuple.Create(5000.50, 4)); ListOfTuples2.Add(Tuple.Create(5000.25, 5)); /* How can I get the Index of the List if doubleTuple = 5000.25 ? */,c#,list,indexing,tuples,C#,List,Indexing,Tuples,您可以使用接受谓词作为参数的列表的FindIndex方法 int index = ListOfTuples2.FindIndex(t => t.Item1 == 5000.25); if (index > = 0) { // found! } 如果没有找到这样的项,FindIndex将返回-1 但是你可以考虑用字典代替。如果集合很大,则查找条目的速度比查找列表快得多。中的检索次数:列表处于打开状态,字典为O1。但是,字典中的项没有顺序,也没有索引。此外,密钥必须是唯一的。如

您可以使用接受谓词作为参数的列表的FindIndex方法

int index = ListOfTuples2.FindIndex(t => t.Item1 == 5000.25);
if (index > = 0) {
    // found!
}
如果没有找到这样的项,FindIndex将返回-1

但是你可以考虑用字典代替。如果集合很大,则查找条目的速度比查找列表快得多。中的检索次数:列表处于打开状态,字典为O1。但是,字典中的项没有顺序,也没有索引。此外,密钥必须是唯一的。如果您需要订购物品,请按清单操作

var dict = new Dictionary<double, int>{
    [doubleTuple] = intTuple,
    [5000.00] = 2,
    [5000.25] = 3,
    [5000.50] = 4,
    [5000.25] = 5
}

if (dict.TryGetValue(5000.25, out int result)) {
    // result is 3; and contains the value, not the index.
}
如果您确定词典包含条目,则只需使用

int result = dict[5000.25];

此外,如果你在处理价格,考虑使用十进制类型。已专门为财务和货币计算创建了If。double类型将值存储为二进制数。0.1十进制是0.000110011。。。二进制,即双精度,仅通过将十进制常数转换为二进制表示形式引入舍入误差,而十进制则按原样存储该常数的每个十进制。对于科学计算来说,双精度是可以的,而且速度更快。温度是29.7度还是29.699999999度没有区别,因为你可以用非常有限的精度来测量它,不管怎样,可能是1%。

你可以使用列表中接受谓词作为参数的FindIndex方法

int index = ListOfTuples2.FindIndex(t => t.Item1 == 5000.25);
if (index > = 0) {
    // found!
}
如果没有找到这样的项,FindIndex将返回-1

但是你可以考虑用字典代替。如果集合很大,则查找条目的速度比查找列表快得多。中的检索次数:列表处于打开状态,字典为O1。但是,字典中的项没有顺序,也没有索引。此外,密钥必须是唯一的。如果您需要订购物品,请按清单操作

var dict = new Dictionary<double, int>{
    [doubleTuple] = intTuple,
    [5000.00] = 2,
    [5000.25] = 3,
    [5000.50] = 4,
    [5000.25] = 5
}

if (dict.TryGetValue(5000.25, out int result)) {
    // result is 3; and contains the value, not the index.
}
如果您确定词典包含条目,则只需使用

int result = dict[5000.25];

此外,如果你在处理价格,考虑使用十进制类型。已专门为财务和货币计算创建了If。double类型将值存储为二进制数。0.1十进制是0.000110011。。。二进制,即双精度,仅通过将十进制常数转换为二进制表示形式引入舍入误差,而十进制则按原样存储该常数的每个十进制。对于科学计算来说,双精度是可以的,而且速度更快。温度是29.7度还是29.699999999度都没有区别,因为您可以以非常有限的精度测量温度,可能是1%。

如果您想获得所有索引,可以编写以下代码:

var indexes = ListOfTuples2.Select((tuple, index) => new {tuple, index}).Where(o => Math.Abs(o.tuple.Item1 - 5000.25) < 1e-5).Select(o => o.index - 1);
foreach (var index in indexes)
{
    Console.WriteLine(index);
}

请注意,比较两个浮点数可能会返回不可预测的结果,因此我使用Math.Abs方法进行比较

如果您想获得所有索引,可以编写以下代码:

var indexes = ListOfTuples2.Select((tuple, index) => new {tuple, index}).Where(o => Math.Abs(o.tuple.Item1 - 5000.25) < 1e-5).Select(o => o.index - 1);
foreach (var index in indexes)
{
    Console.WriteLine(index);
}

请注意,比较两个浮点数可能会返回不可预测的结果,因此我使用Math.Abs方法进行比较

您尝试了什么?这应该是很容易与外汇林齐意味着名单的索引。在本例中,如果doubleTuple=5000.25,则返回值应为2,因为它是第三个,第一个是0。您尝试了什么?这应该是很容易与外汇林齐意味着名单的索引。在这种情况下,如果doubleTuple=5000.25,返回值应该是2,因为它是第三个,第一个是0,非常感谢!!它起作用了!我是一个菜鸟,被困在这里了!非常感谢!!它起作用了!我是一个菜鸟,被困在这里了!