Найти указатель списка кортежей из 1 предмета - PullRequest
0 голосов
/ 30 декабря 2018

Пожалуйста, рассмотрите список кортежей в C #.Это относится к исходному кортежу (не к кортежу значения).Как я могу получить индекс списка, если я знаю один из элементов в списке кортежей?

        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 ?  */  

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Если вы хотите получить все индексы, вы можете написать следующий код:

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 метод

0 голосов
/ 30 декабря 2018

Вы можете использовать FindIndex метод списка, принимающий предикат в качестве аргумента

int index = ListOfTuples2.FindIndex(t => t.Item1 == 5000.25);
if (index > = 0) {
    // found!
}

FindIndex возвращает -1, если такой элемент не найден.


Но вы можете рассмотреть возможность использования словаря.Если коллекция большая, она находит записи намного быстрее, чем список.Время поиска в Big O записи : List<T> равно O(n), Dictionary<K,V> равно O(1).Однако элементы в словаре не упорядочены и не имеют индекса.Кроме того, ключи должны быть уникальными.Если вам нужны заказанные товары, придерживайтесь списка.

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.
}

Вы также можете добавить записи с помощью

dict.Add(5000.75, 8);

Если вы уверены, что словарь содержит запись, вы можете просто получитьэто с

int result = dict[5000.25];

Кроме того, если вы имеете дело с ценами, рассмотрите возможность использования типа decimal.Если был создан специально для финансовых и денежных расчетов.Тип double хранит значения в виде двоичных чисел.0.1 (десятичный) равен 0.000110011001100110011001100110011... (двоичный), т. Е. double вводит ошибку округления исключительно путем преобразования десятичной константы в ее двоичное представление, тогда как decimal сохраняет каждый десятичный знак константы как есть.double хорошо (и быстрее) для научных расчетов.Не имеет значения, является ли температура 29,7 или 29,69999999999 градусов, поскольку вы можете в любом случае измерять ее с очень ограниченной точностью (возможно, 1%).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...