我有以下代碼示例。我需要做的是在他們的事件順序中的任何地方找到所有具有“ABC”組合的用戶。所以 Bob 和 Jim 符合這個描述,因為 Bob 的事件是 'VABCR' 而 Jim 的事件是 'ABC'。我想通過不使用 2 個 foreach 回圈來提高 DoWork 方法的效率。有什么更好、更修改的方式來獲得所有擁有“ABC”組合的用戶。
static void Main(string[] args)
{
var events = new List<Events>()
{
new Events { User = "Bob",Event = 'V'},
new Events { User = "Jim",Event = 'A'},
new Events { User = "Bob",Event = 'A'},
new Events { User = "Bob",Event = 'B'},
new Events { User = "Sally",Event = 'V'},
new Events { User = "Jim",Event = 'B'},
new Events { User = "Sally",Event = 'C'},
new Events { User = "Bob",Event = 'C'},
new Events { User = "Jim",Event = 'C'},
new Events { User = "Bob",Event = 'R'}
};
var names = DoWork(events);
foreach (var a in names)
{
Console.WriteLine(a);
}
Console.ReadKey();
}
public static List<string> DoWork(List<Events> events)
{
List<string> names = new List<string>();
var distinct = events.Select(x => x.User).Distinct();
foreach (var name in distinct)
{
string e = string.Empty;
foreach (var evnt in events.Where(y => y.User == name))
{
e = evnt.Event;
}
if (e.Contains("ABC"))
{
names.Add(name);
}
}
return names;
}
public class Events
{
public string User { get; set; }
public char Event { get; set; }
}
uj5u.com熱心網友回復:
除了嵌套foreach回圈之外,您正在使用性能糟糕e的模式構建字串 =:對于 Bob 的事件,它必須創建單獨的字串物件來表示“V”、“VA”、“VAB”、“VABC”等.,這會浪費CPU時間和記憶體。
一點 LINQ 可以在這里提供幫助。
public static List<string> DoWork(List<Events> events)
{
return events.GroupBy(e => e.User)
.Where(g => string.Concat(g.Select(u => u.Event)).Contains("ABC"))
.Select(g => g.Key)
.ToList();
}
- GroupBy 是串列
O(n)中n的專案數。 string.Concat其中string.Contains是每組O(m)的m事件數,所以所有組的總和是O(n)。
我應該注意,對于少數事件,您當前的代碼可以正常作業。在這里使用 LINQ 的主要優點是它的宣告式風格更能說明您想要以什么方式結束,而不是您希望以何種方式結束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/532863.html
標籤:C#表现林克
