यहां एक ऐसा है जो आयताकार (गैर-रैग किए गए) मैट्रिस के लिए काम करता है। सी # कोड यहां एक मुक्त, इंटरैक्टिव सी # प्रोग्रामिंग टूल, LinqPad में कट-एंड-पेस्ट काम करता है।
मैं एक पोस्टफिक्स ऑपरेटर (यानी, एक विस्तार विधि) परिभाषित करता हूं "ट्रांसपोज़ करें।"
var rand = new Random();
var xss = new [] {
new [] {rand.NextDouble(), rand.NextDouble()},
new [] {rand.NextDouble(), rand.NextDouble()},
new [] {rand.NextDouble(), rand.NextDouble()},
};
xss.Dump("Original");
xss.Transpose().Dump("Transpose");
कुछ इस तरह है, जिसके परिणामस्वरूप: इस प्रकार ऑपरेटर का प्रयोग करें
Original
0.843094345109116
0.981432441613373
0.649207864724662
0.00594645645746331
0.378864820291691
0.336915332515219
Transpose
0.843094345109116
0.649207864724662
0.378864820291691
0.981432441613373
0.00594645645746331
0.336915332515219
इस ऑपरेटर के कार्यान्वयन का सार पीछा कर रहा है
public static IEnumerable<IEnumerable<T>> Transpose<T>(this IEnumerable<IEnumerable<T>> xss)
{
var heads = xss.Heads();
var tails = xss.Tails();
var empt = new List<IEnumerable<T>>();
if (heads.IsEmpty())
return empt;
empt.Add(heads);
return empt.Concat(tails.Transpose());
}
यहाँ पूर्ण कार्यान्वयन है, कुछ पंक्तियों के साथ टिप्पणी की गई कि आप काम करने के लिए असुविधा कर सकते हैं कि फ़ंक्शन कैसे काम करता है।
void Main()
{
var rand = new Random();
var xss = new [] {
new [] {rand.NextDouble(), rand.NextDouble()},
new [] {rand.NextDouble(), rand.NextDouble()},
new [] {rand.NextDouble(), rand.NextDouble()},
};
xss.Dump("Original");
xss.Transpose().Dump("Transpose");
}
public static class Extensions
{
public static IEnumerable<T> Heads<T>(this IEnumerable<IEnumerable<T>> xss)
{
Debug.Assert(xss != null);
if (xss.Any(xs => xs.IsEmpty()))
return new List<T>();
return xss.Select(xs => xs.First());
}
public static bool IsEmpty<T>(this IEnumerable<T> xs)
{
return xs.Count() == 0;
}
public static IEnumerable<IEnumerable<T>> Tails<T>(this IEnumerable<IEnumerable<T>> xss)
{
return xss.Select(xs => xs.Skip(1));
}
public static IEnumerable<IEnumerable<T>> Transpose<T>(this IEnumerable<IEnumerable<T>> xss)
{
// xss.Dump("xss in Transpose");
var heads = xss.Heads()
// .Dump("heads in Transpose")
;
var tails = xss.Tails()
// .Dump("tails in Transpose")
;
var empt = new List<IEnumerable<T>>();
if (heads.IsEmpty())
return empt;
empt.Add(heads);
return empt.Concat(tails.Transpose())
// .Dump("empt")
;
}
}
@ डीबीएम: परिभाषा क्या है AddRange का? –
@ रीब। केबिन: http://msdn.microsoft.com/en-us/library/z883w3dc.aspx –