2013-04-03 9 views
7

में निर्दिष्ट सूचकांक के अनुसार मान लीजिए कि हमारे डेटा के साथ एक सरणी है:चुनना तत्वों एक और सरणी सी #

int[] ind = new int[N] {i_1, ..., i_N}; 
: लेबल x के तत्वों के लिए इसी युक्त आकार N की

double[] x = new double[N] {x_1, ..., x_N}; 

और सरणी

से सभी तत्वों का चयन करने का सबसे तेज़ तरीका क्या है जिसमें ind के अनुसार कुछ लेबल I है?

उदाहरण के लिए,

x = {3, 2, 6, 2, 5} 
ind = {1, 2, 1, 1, 2} 
I = ind[0] = 1 

परिणाम:

y = {3, 6, 2} 

जाहिर है, यह आसानी से (लेकिन कुशलता और स्वच्छ) छोरों के साथ किया जा सकता है, लेकिन मुझे लगता है जिस तरह से कैसे करने के लिए होना चाहिए करना है कि .Where और lambdas..Thanks

संपादित करें का उपयोग कर:

MarcinJuraszek द्वारा प्रदान किया गया जवाब पूरी तरह से सही है, धन्यवाद। हालांकि, मैंने उम्मीद में सवाल को सरल बना दिया है कि यह मेरी मूल स्थिति में काम करेगा। आप कृपया एक नज़र कि समस्या क्या है ले सकता है अगर हम सामान्य प्रकार है:

T1[] xn = new T1[N] {x_1, ..., x_N}; 
T2[] ind = new T2[N] {i_1, ..., i_N}; 
T2 I = ind[0] 

समाधान प्रदान मैं कोई त्रुटि मिलती है "प्रतिनिधि 'System.Func' 2 तर्क ले नहीं है" का उपयोग करना:

T1[] y = xn.Where((x, idx) => ind[idx] == I).ToArray(); 

आपको बहुत बहुत धन्यवाद

उत्तर

14

कैसे उस के बारे में:

var xs = new[] { 3, 2, 6, 2, 5 }; 
var ind = new[] { 1, 2, 1, 1, 2 }; 
var I = 1; 

var results = xs.Where((x, idx) => ind[idx] == I).ToArray(); 

यहदूसरा, कम लोकप्रिय का उपयोग करता हैअधिभार:

Enumerable.Where<TSource>(IEnumerable<TSource>, Func<TSource, Int32, Boolean>)

जो आइटम सूचकांक विधेय पैरामीटर के रूप में उपलब्ध है (मेरी समाधान में idx कहा जाता है)।

जेनेरिक संस्करण

public static T1[] WhereCorresponding<T1, T2>(T1[] xs, T2[] ind) where T2 : IEquatable<T2> 
{ 
    T2 I = ind[0]; 
    return xs.Where((x, idx) => ind[idx].Equals(I)).ToArray(); 
} 

प्रयोग

static void Main(string[] args) 
{ 
    var xs = new[] { 3, 2, 6, 2, 5 }; 
    var ind = new[] { 1, 2, 1, 1, 2 }; 

    var results = WhereCorresponding(xs, ind); 
} 

जेनेरिक + double संस्करण

public static T[] Test<T>(T[] xs, double[] ind) 
{ 
    double I = ind[0]; 

    return xs.Where((x, idx) => ind[idx] == I).ToArray(); 
} 
+0

पिन का उपयोग कर के बारे में सोच रहा था, लेकिन बिल्ली: इस की तुलना में कम यह नहीं है वाला .. – flq

+0

यह बहुत अच्छा है , धन्यवाद। क्या आप प्रश्न के संपादित संस्करण को देख सकते हैं? –

+1

जेनिक्स के लिए आपको यह सुनिश्चित करना होगा कि 'टी 2 == टी 2' (या 'टी 2.इक्वाल्स (टी 2)') परिभाषित किया गया है - जेनेरिक बाधा जोड़ें' जहां टी 2: आईक्वेटेबल ' – MarcinJuraszek

4

यह Enumerable.Zip के लिए क्लासिक उपयोग है, जो एक दूसरे के समानांतर दो समकक्षों के माध्यम से चलता है। ज़िप का उपयोग करके आप अपने परिणाम एक पास के साथ प्राप्त कर सकते हैं।पीछा कर रहा है पूरी तरह से टाइप-नास्तिक, हालांकि मैं उदाहरण के लिए int और string रों का उपयोग करें:

int[] values = { 3, 2, 6, 2, 5 }; 
string[] labels = { "A", "B", "A", "A", "B" }; 
var searchLabel = "A"; 

var results = labels.Zip(values, (label, value) => new { label, value }) 
        .Where(x => x.label == searchLabel) 
        .Select(x => x.value); 
संबंधित मुद्दे