簡體   English   中英

從列表中刪除具有優先級的項目

[英]Remove Items from list with priority

讓我們假設我有一個列表,我想刪除 accoding 條件是如果優先項目在那里然后刪除所有較小的優先項目。 例如

Sortedarr[] =["world champion","Best performer","Best gold", "Best silver", "Best bronze", "regional"]

狀況。

  1. 如果有金牌,我想要除了銀牌和銅牌之外的所有獎牌。
  2. 如果不存在金,但存在最大銀,則僅顯示銀而不是青銅
  3. 如果銀和金都不存在,則顯示青銅。

該數組將始終進行排序,因此始終是金>銀>青銅的順序。

我的實施工作正常,但我認為這不是優化的方式。

    if(arr.Contains("Best gold")){
                sortedArr.RemoveAll(x => ((string)x) == "Best silver" 
                 || ((string)x) == "Best Bronze" );
            }
    if (sortedArr.Contains("Best silver")) {
                sortedArr.RemoveAll(x =>((string)x) == "Best bronze");
            }
         

先感謝您

你的問題不清楚。 但您可以使用Array.IndexOf 方法來檢查項目是否存在:

List<string> array =(new string[] {"world champion", "Best performer", "Best gold", "Best silver", "Best bronze", "regional"}).ToList();

if (array.IndexOf("Best gold") > 0) 
    array.RemoveAll(m=>m.Contains("Best silver") || m.Contains("Best bronze"));

else if (array.IndexOf("Best silver") > 0)
    array.RemoveAll(m => m.Contains("Best bronze"));
List<string> array =(new string[] {"world champion", "Best performer", "Best gold", "Best silver", "Best bronze", "regional"});

    array.Contains("Best gold")  ? array.RemoveAll(x => ((string)x) == "Best silver" || ((string)x) == "Best Bronze" ) 
                                 : (array.Contains("Best silver") ?
                                  array.RemoveAll(x =>((string)x) == "Best bronze")
                                 : return array)
                         

如果涉及到排序,我建議為字符串實現自己的比較器,因此實現接口IComparer<string>

下面簡單地檢查比較字符串是否包含金、銀或銅,並根據獎牌得分給出所需的 output。

在平局的情況下,我們回退到選擇的比較器,這里是StringComparer.OrdinalIgnoreCase

如果比較的字符串都不包含任何獎牌,那么我們也會回退到選擇的比較類型。

public class MedalComparer : IComparer<string>
{
    private const string Gold = "gold";
    private const string Silver = "silver";
    private const string Bronze = "bronze";
    // Here you should put all medals with respctive score
    private static readonly Dictionary<int, string> Medals = new()
    {
        {1, Gold}, {2, Silver}, {3, Bronze},
    };

    private static readonly StringComparison StringComparison = StringComparison.OrdinalIgnoreCase;
    private static readonly IComparer<string> _fallbackComparer = StringComparer.OrdinalIgnoreCase;

    public int Compare(string x, string y)
    {
        return IsTie(x, y)
            ? _fallbackComparer.Compare(x, y)
            : Evaluate(x, y) ?? _fallbackComparer.Compare(x, y);
    }

    private static bool IsTie(string x, string y)
    {
        return (x.Contains(Gold, StringComparison) && y.Contains(Gold, StringComparison)) ||
            (x.Contains(Silver, StringComparison) && y.Contains(Silver, StringComparison)) ||
            (x.Contains(Bronze, StringComparison) && y.Contains(Bronze, StringComparison));
    }

    private static int? Evaluate(string x, string y)
    {
        foreach (var medalKey in Medals.Keys.OrderBy(x => x))
        {
            if(x.Contains(Medals[medalKey], StringComparison))
            {
                return 1;
            }

            if (y.Contains(Medals[medalKey], StringComparison))
            {
                return -1;
            }
        }

        return null;
    }
}

然后就可以方便的傳給OrderBy方法了,如下所示:

public static class Program
{
    public static async Task Main(string[] args)
    {
        var testData = new[]{ "world champion","Best performer","Best gold", "Best silver", "Best bronze", "regional"};

        var sorted = testData.OrderBy(x => x, new MedalComparer());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM