我有一组电子邮件。
我需要使用where
表达式获取两个数组。
var firstArray = emailTo.Where(e => whiteList.Contains(e.Address));
var secondArray = emailTo.Where(e => !whiteList.Contains(e.Address));
怎么做?
P.S。在我写作的时候,我已经明白了如何做到这一点:
emailTo.ForEach(e => ... use if construction and add to array ... );
也许你有任何解决方案?
答案 0 :(得分:8)
var twoArrays = emailTo.GroupBy(e => whiteList.Contains(e.Address),
(key,g) => g.ToArray())
.ToList();
var firstArray = twoArrays[0];
var secondArray = twoArrays[1];
注意:上面的firstArray
和secondArray
可能不是代码中的firstArray
和secondArray
。那是因为无法确定数组的顺序。为确保您可以在OrderBy(g=>g.Key)
之后添加GroupBy
,然后Select
,请按以下方式添加:
var twoArrays = emailTo.GroupBy(e => whiteList.Contains(e.Address))
.OrderBy(g=>g.Key).Select(g=>g.ToArray())
.ToList();
//Now the firstArray is always at the index 1
var firstArray = twoArrays[1];
var secondArray = twoArrays[0];
答案 1 :(得分:2)
您只需使用Enumerable.ToArray
:
var firstArray = emailTo.Where(e => whiteList.Contains(e.Address)).ToArray();
var secondArray = emailTo.Where(e => !whiteList.Contains(e.Address)).ToArray();
Side-Note_而不是List.ForEach
,这是一个循环列表的.NET 2.0方法,我将使用简单的foreach
。然后你不需要创建另一个集合。
foreach(var emailTo in firstArray)
{
// ...
}
答案 2 :(得分:0)
var firstArray = emailTo.Where(e => whiteList.Contains(e.Address)).ToArray();
var secondArray = emailTo.Except(firstArray).ToArray();