[英]Remove Items from list with priority
讓我們假設我有一個列表,我想刪除 accoding 條件是如果優先項目在那里然后刪除所有較小的優先項目。 例如
Sortedarr[] =["world champion","Best performer","Best gold", "Best silver", "Best bronze", "regional"]
狀況。
該數組將始終進行排序,因此始終是金>銀>青銅的順序。
我的實施工作正常,但我認為這不是優化的方式。
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.