Заказать список определенным образом - PullRequest
0 голосов
/ 07 июня 2019

У меня проблема. У меня есть список с 4 монетами и 4 значениями. Теперь список отсортирован по имени:

 1. BTC---Value
 2. ETH---Value
 3. LTC---Value
 4. USDT---Value

Но теперь я хочу получить список, в котором осталось только 2 монеты: Последняя монета должна быть USDT, а первая монета - это монета с наибольшим достоинством. Так, например, если все монеты имеют значение 3, а BTC имеет значение 4, тогда я хочу список вроде этого:

 1. BTC---Value
 2. USDT---Value

Как я могу это сделать, потому что я знаю, как сортировать по значению, но не со всеми моими предпочтениями ....

Может ли кто-нибудь мне помочь?

1012 * ПОДРОБНОСТИ *
Даже если USDT имеет наибольшее значение, я хочу эту монету на последнем месте. Если вы добавите еще одну монету, ей нужно просто снова посмотреть на самое высокое значение (за исключением USDT) и поместить эту монету сверху, а USDT на втором месте!

Ответы [ 4 ]

2 голосов
/ 07 июня 2019

Обновлен код на основе комментария DubDub.

 var intermediate =  list.OrderBy(x=> x.Name=="USDT").ThenByDescending(x=>x.Value);
 var result = new []{intermediate.First(),intermediate.Last()};

Пример, Сценарий 1: при наличии более 2 предметов

 var list = new List<Coin>
 {
    new Coin{Name="USDT", Value = 29},
    new Coin{Name="ETH", Value = 13},
    new Coin{Name="LTC", Value = 21},
    new Coin{Name="BTC", Value = 3},
 };

выход

enter image description here

Сценарий 2: когда есть только два предмета

 var list = new List<Coin>
 {
    new Coin{Name="USDT", Value = 29},
    new Coin{Name="LTC", Value = 21},
 };

enter image description here

1 голос
/ 07 июня 2019

Вы могли бы сделать это с Linq. Это не изменит список, это создаст новый список, отсортированный по вашим критериям.

var sortedCoins = coins.OrderBy(c => c.Name == "USDT").ThenByDescending(c => c.Value);
0 голосов
/ 07 июня 2019

Используя следующий украденный класс из предыдущего ответа, который сейчас пропал, поэтому я не уверен, кому отдать должное, но вы должны быть в состоянии сделать следующее.

Класс монет

public class Coin
{
    public string Name { get; set; }
    public double Value { get; set; }
}

Фактический код для обработки списка

List<Coin> list = new List<Coin>
{
    new Coin{Name="USDT", Value = 29},
    new Coin{Name="ETH", Value = 13},
    new Coin{Name="LTC", Value = 21},
    new Coin{Name="BTC", Value = 3},
};

// Take out USDT coin
Coin USDTcoin = list.Find(coin => coin.Name == "USDT");
list.RemoveAt(list.FindIndex(coin => coin.Name == "USDT"));

// Order list
list = list.OrderByDescending(coin => coin.Value).ToList();

// Make new list
list = new List<Coin>
{
    list[0],
    USDTcoin
};
0 голосов
/ 07 июня 2019

Таким образом:

class Program
{
    static void Main(string[] args)
    {
        List<Coin> coins = new List<Coin>()
        {
            new Coin ("BTC", 1),
            new Coin ("ETH", 2),
            new Coin ("LTC", 3),
            new Coin ("USDT", 4),
        };

        Coin usdt = coins.First(x => x.Name == "USDT");

        coins.Remove(usdt);

        coins = new List<Coin>() { coins.OrderByDescending(x => x.Value).First(), usdt };
    }
}

public class Coin
{
    public string Name { get; set; }
    public double Value { get; set; }

    public Coin(string name, double value)
    {
        Name = name;
        Value = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...