還有就是要算它符合一些條件的元素數量的標準方式:LINQ查詢問題
collection.Where(d=> d==something).Count();
我需要以下功能(僞COD):
collection.Where(d=> (d==something) && (d.Next == somethingElse)).Count();
編輯:d.Next - 是集合中d之後的下一個元素。
這是如何實現的?
還有就是要算它符合一些條件的元素數量的標準方式:LINQ查詢問題
collection.Where(d=> d==something).Count();
我需要以下功能(僞COD):
collection.Where(d=> (d==something) && (d.Next == somethingElse)).Count();
編輯:d.Next - 是集合中d之後的下一個元素。
這是如何實現的?
假設你所擁有的是一個涉及源序列中連續元素的謂詞,你可以這樣做:
int numMatches = collection.Zip(collection.Skip(1), (prev, next) =>
prev == something && next == somethingElse)
.Count(match => match)
在應用過濾器之前,這會在序列的一個延遲版本上疊加序列。
var result = collection.Count(d =>
d == something &&
d.Next == somethingElse
);
編輯:的情況下,如果d.Next
的d
屬性或序列中的下一個元素:
var result = collection.Zip(
collection.Skip(1),
(first, second) => first == something && second == somethingElse
).Count(i => i);
可以寫一個新的操作符(假定LINQ到對象)明確地使用枚舉器來檢查它。
代碼:
public static partial class Enumerable
{
public static IEnumerable<TSource> WhereNext<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource next)
{
if (source == null)
throw new ArgumentNullException("source");
if (predicate == null)
throw new ArgumentNullException("predicate");
return WhereNextImpl(source, predicate, next);
}
private static IEnumerable<TSource> WhereNextImpl<TSource>(IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource next)
{
using (var enumerator = source.GetEnumerator())
{
TSource current;
TSource nextElement;
if (!enumerator.MoveNext())
yield break;
while (true)
{
current = enumerator.Current;
if (!enumerator.MoveNext())
yield break;
nextElement = enumerator.Current;
if (predicate(current) && EqualityComparer<TSource>.Default.Equals(next, nextElement))
yield return current;
}
}
}
}
警告:目前使用EqualityComparer<TSource>.Default
的比較。應使用自定義比較器的另一個實現。
如果集合是stirng的列表,你可以嘗試像涉及讓利
var selectC = from c in collection
let nextC = collection.IndexOf(c) == collection.Count - 1 ? null : collection[collection.IndexOf(c) + 1]
where string.IsNullOrEmpty(c) && string.IsNullOrEmpty(nextC)
select c;
查詢是棘手轉化爲方法鏈,但我得到這個從ReSharper的自動轉換
var selectC =
collection.Select(
c =>
new {c, nextC = collection.IndexOf(c) == collection.Count - 1 ? null : collection[collection.IndexOf(c) + 1]}).
Where(@t => string.IsNullOrEmpty(@t.c) && string.IsNullOrEmpty(@t.nextC)).Select(@t => @t.c);
可以使用Aggregate Method創建自定義的總和:
var result = collection.Aggregate(
Tuple.Create(false, 0),
(s, x) => Tuple.Create(x == something,
s.Item1 + (s.Item0 && (x == somethingElse) ? 1 : 0)),
s => s.Item1);
它的工作原理是這樣的:
Item Accumulator --------------- --------------- (false, 0) foo (false, 0) something (true, 0) bar (false, 0) something (true, 0) somethingElse (false, 1) somethingElse (false, 1) baz (false, 1) --------------- Result: 1
有趣的實現。 – Peter17 2011-03-05 16:05:54
是'd.Next' D'或'的屬性序列中的下一個元素? – Ani 2011-03-05 14:56:10
不,下一個是集合中的下一個元素。 – Peter17 2011-03-05 15:00:54