我有交易的名單,我需要找到,如果有更多的則是1個帳戶C#中的LINQ - 檢查多在列表
我做
var MultipleAccounts = list.GroupBy(t => t.AccountId).Count() > 1;
有沒有更好的辦法?
我有交易的名單,我需要找到,如果有更多的則是1個帳戶C#中的LINQ - 檢查多在列表
我做
var MultipleAccounts = list.GroupBy(t => t.AccountId).Count() > 1;
有沒有更好的辦法?
如果你願意失去單行我更喜歡使用!.All(item => bool)
或.Any(item => bool)
,因爲我認爲它是最具語義和最易讀的,同時也是最快的候選人。
var accountId = accounts[0].AccountId;
var hasMultipleAccounts = !accounts.All(account => account.AccountId == accountId);
或者,甚至更多的語義,你可以使用.Any(item => bool)
,而不是.All(item => bool)
。
var accountId = accounts[0].AccountId;
var hasMultipleAccounts = accounts.Any(account => account.AccountId != accountId);
事情需要提防的是確保你至少有一個項目(使帳戶[0]不會失敗),而不是做你的IEnumerable的倍數枚舉。你說你正在使用一個List,所以多次枚舉不應該給你帶來任何麻煩,但是當你只有一個未知的IEnumerable的時候,小心一點很重要。
找到第一個不匹配後會返回嗎?或繼續在列表中運行? – CMS
他只是想要所有多個帳戶,如果第一個帳戶在任何地方重複,則不是真/假 –
這會計算錯誤的結果。當所有帳戶相同時,它將'hasMultipleAccounts'設置爲'true'。 – Enigmativity
我喜歡:
var MultipleAccounts = list.Select(t => t.AccountId).Distinct().Skip(1).Any();
這應該是非常快,因爲它會停止,一旦迭代源list
爲它找到一個第二AccountId
。
無論何時執行完整的.Count()
它都必須迭代完整的源列表。
您可以用下面的代碼測試:
void Main()
{
Console.WriteLine(Data().Select(t => t).Distinct().Skip(1).Any());
}
private Random __random = new Random();
public IEnumerable<int> Data()
{
while (true)
{
var @return = __random.Next(0, 10);
Console.WriteLine(@return);
yield return @return;
}
}
一個典型的運行是這樣的:
7 9 True
我不知道你是否知道,但.Distinct()正在做一個新的枚舉,可能比只使用我的方法慢。 – CMS
@CMS - 你的方法仍然枚舉。 – Enigmativity
確定這裏是我發現的最快捷
public bool HasMultipleAccounts(List<Account> list)
{
foreach (var account in list)
if (account.AccountId != list[0].AccountId)
return true;
return false;
}
用法:var MultipleAccounts = HasMultipleAccounts(list);
現金@hvd
我知道它更多的代碼,但如果你認爲什麼樣的CPU需要做的最快
他想擁有一個賬戶清單,而不是與第一個賬戶 –
@MaksimSimkin比較結果 - 在問題中沒有任何關於這一點的信息。 – Enigmativity
它需要是LINQ嗎?你可以有一個'HashSet accountIds',然後遍歷每個帳戶並調用'ISet .Add',這將在您第一次看到重複時返回'false'。 –
我已經在一個列表中(爲了接下來的事情),是否值得投入HashSet? – CMS
您是否試圖查看是否有多個組或者是否有任何組有多個成員? – Abion47