2017-01-08 35 views
0

我有交易的名單,我需要找到,如果有更多的則是1個帳戶C#中的LINQ - 檢查多在列表

我做

var MultipleAccounts = list.GroupBy(t => t.AccountId).Count() > 1; 

有沒有更好的辦法?

+3

它需要是LINQ嗎?你可以有一個'HashSet accountIds',然後遍歷每個帳戶並調用'ISet .Add',這將在您第一次看到重複時返回'false'。 –

+0

我已經在一個列表中(爲了接下來的事情),是否值得投入HashSet? – CMS

+0

您是否試圖查看是否有多個組或者是否有任何組有多個成員? – Abion47

回答

2

如果你願意失去單行我更喜歡使用!.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的時候,小心一點很重要。

+0

找到第一個不匹配後會返回嗎?或繼續在列表中運行? – CMS

+0

他只是想要所有多個帳戶,如果第一個帳戶在任何地方重複,則不是真/假 –

+1

這會計算錯誤的結果。當所有帳戶相同時,它將'hasMultipleAccounts'設置爲'true'。 – Enigmativity

0

我喜歡:

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 
+0

我不知道你是否知道,但.Distinct()正在做一個新的枚舉,可能比只使用我的方法慢。 – CMS

+1

@CMS - 你的方法仍然枚舉。 – Enigmativity

1

確定這裏是我發現的最快捷

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需要做的最快

+0

他想擁有一個賬戶清單,而不是與第一個賬戶 –

+0

@MaksimSimkin比較結果 - 在問題中沒有任何關於這一點的信息。 – Enigmativity