को ध्यान में रखते:
var arrayOfElements = new[] {
new { Id = 1, Flagged = true },
new { Id = 2, Flagged = false },
new { Id = 3, Flagged = false },
new { Id = 4, Flagged = true },
new { Id = 5, Flagged = false },
new { Id = 6, Flagged = false },
new { Id = 7, Flagged = false },
new { Id = 8, Flagged = true },
new { Id = 9, Flagged = false }
};
आप लिख सकते हैं:
var grouped =
from i in arrayOfElements
where i.Flagged
select
(new[] { i.Id })
.Union(arrayOfElements.Where(i2 => i2.Id > i.Id).TakeWhile(i2 => !i2.Flagged).Select(i2 => i2.Id))
.ToArray();
यह काम करता है अगर आपके तत्व ordere हैं आईडी विशेषता द्वारा डी। यदि वे नहीं करते हैं, तो आपको अपनी मूल सरणी पर अनुक्रमित करना होगा, जो कि linq के साथ भी करना आसान होना चाहिए, इसलिए आपको अनुक्रम मिलेगा।
इसके अलावा, एक बेहतर विकल्प होना चाहिए:
// for each flagged element, slice the array,
// starting on the flagged element until the next flagged element
var grouped =
from i in arrayOfElements
where i.Flagged
select
arrayOfElements
.SkipWhile(i2 => i2 != i)
.TakeWhile(i2 => i2 == i || !i2.Flagged)
.Select(i2 => i2.Id)
.ToArray();
ध्यान दें कि उन जवाब शुद्ध LINQ का उपयोग कर रहे हैं।
स्रोत
2010-04-08 21:23:37
लैम्ब्डा समारोह में हालत क्यों है ' item.Flagged! = prevItem.Flagged '? ध्वज गलत से बदलते हैं तो आप एक नया खंड बनायेंगे। मुझे लगता है कि स्थिति सिर्फ 'आइटम' फ्लेग किया जाना चाहिए, और पिछले आइटम से बिल्कुल निर्भर नहीं होना चाहिए। –
@phild: आप सही हैं, 'item.Flagged' पर्याप्त है। मैं पहले जल्दी में था और ओपी की उम्मीदों का गलत व्याख्या करता था। मैंने अपनी प्रतिक्रिया अपडेट की है। – LBushkin
+1, बहुत उपयोगी विस्तार विधि :) –