खैर, यह शायद नहीं है मैं इसे कैसे लिखना चाहते हैं, लेकिन:
static IEnumerable<T[]> Permute<T>(this T[] xs, params T[] pre) {
if (xs.Length == 0) yield return pre;
for (int i = 0; i < xs.Length; i++) {
foreach (T[] y in Permute(xs.Take(i).Union(xs.Skip(i+1)).ToArray(), pre.Union(new[] { xs[i] }).ToArray())) {
yield return y;
}
}
}
अपनी टिप्पणी पुन; मैं पूरी तरह से पर सवाल नहीं कर रहा हूं; अगर आपका मतलब है "यह उपयोगी क्यों है?" - अन्य चीजों के अलावा, ब्रूट-फोर्स परिदृश्यों की एक श्रृंखला है जहां आप विभिन्न क्रमपरिवर्तनों को आजमा सकते हैं - उदाहरण के लिए, छोटी बिक्री समस्याओं जैसे कि यात्रा करने वाले व्यक्ति (जो अधिक परिष्कृत समाधान की गारंटी देने के लिए पर्याप्त नहीं हैं) के लिए, आप हो सकता है कि यह जांचना चाहें कि {बेस, ए, बी, सी, बेस}, {बेस, ए, सी, बी, बेस}, {बेस, बी, ए, सी, बेस}, आदि
यदि आपका मतलब है "मैं इस विधि का उपयोग कैसे करूं?" - अनचाहे, लेकिन कुछ ऐसा:
int[] values = {1,2,3};
foreach(int[] perm in values.Permute()) {
WriteArray(perm);
}
void WriteArray<T>(T[] values) {
StringBuilder sb = new StringBuilder();
foreach(T value in values) {
sb.Append(value).Append(", ");
}
Console.WriteLine(sb);
}
यदि आपका मतलब है "यह कैसे काम करता है?" - इटरेटर ब्लॉक (yield return
) स्वयं में एक जटिल विषय हैं - जॉन के पास एक निशुल्क अध्याय (6) in his book है, हालांकि। शेष कोड आपके मूल प्रश्न की तरह बहुत अधिक है - केवल +
(सरणी के लिए) के नैतिक समकक्ष प्रदान करने के लिए LINQ का उपयोग करना।
कमी लगभग निश्चित रूप से सी # कोड clumsier कर देगा, लेकिन इसके निश्चित रूप से संभव सी # में लाइन के लिए रेखा से ऊपर कोड का अनुवाद करने में। – Juliet
यह वास्तव में पढ़ने के लिए मुश्किल है .. – hasen