दो संग्रह ए और बी को देखते हुए, मैं आउटपुट करना चाहता हूं:
1. उनका आंतरिक जुड़ाव (जैसे आईडी नामक क्षेत्र पर)
2. ए में वे तत्व जो बी में नहीं पाए जा सके
3. बी में वे तत्व जो ए में नहीं पाए जा सके
ऐसा करने का सबसे कारगर तरीका क्या है?
जब मैं ए में उन तत्वों को कहता हूं जो बी में नहीं पाए जा सकते हैं, तो मेरा मतलब उन तत्वों से है जो बी के साथ "आंतरिक-जुड़े" नहीं हो सके
3 जवाब
मुझे लगता है कि मैं इसे लिखूंगा:
public class DeltaSet<T>
{
public ISet<T> FirstItems { get; private set; }
public ISet<T> SecondItems { get; private set; }
public ISet<Tuple<T, T>> IntersectedItems { get; private set; }
// T is the type of the objects, U is the key used to determine equality
public static DeltaSet<T> GetDeltaSet<T, U>(IDictionary<U, T> first,
IDictionary<U, T> second)
{
var firstUniques = new HashSet<T>(
first.Where(x => !second.ContainsKey(x.Key)).Select(x => x.Value));
var secondUniques = new HashSet<T>(
second.Where(x => !first.ContainsKey(x.Key)).Select(x => x.Value));
var intersection = new HashSet<Tuple<T, T>>(
second.Where(x => first.ContainsKey(x.Key)).Select(x =>
Tuple.Create(first[x.Key], x.Value)));
return new DeltaSet<T> { FirstItems = firstUniques,
SecondItems = secondUniques,
IntersectedItems = intersection };
}
public static DeltaSet<IDClass> GetDeltas(IEnumerable<IDClass> first,
IEnumerable<IDClass> second)
{
return GetDeltaSet(first.ToDictionary(x => x.ID),
second.ToDictionary(x => x.ID));
}
}
आंतरिक जुड़ाव के लिए, .Join()
विस्तार विधि पर एक नज़र डालें: http ://msdn.microsoft.com/en-us/library/bb344797.aspx
दूसरे 2 आउटपुट के लिए, .Except()
एक्सटेंशन विधि पर एक नज़र डालें। http://msdn.microsoft.com/en-us/library/bb300779.aspx
अधिकांश LINQ प्रश्नों के उदाहरणों के लिए, इस पृष्ठ पर एक नज़र डालें: http://msdn .microsoft.com/en-us/vcsharp/aa336746
मान लें कि आपके पास संग्रह ए में तत्वों के लिए कक्षा ए है और संग्रह बी में कक्षा बी है
class AB {
public A PartA;
public B PartB;
// Constructor
};
public void ManyJoin (List<A> colA, List<B> colB)
{
List<AB> innerJoin = new List<AB>();
List<A> leftJoin = new List<A>();
List<B> rightJoin = new List<B>();
bool[] foundB = new bool[colB.Count];
foreach (A itemA in colA)
{
int i = colB.FindIndex(itemB => itemB.ID == itemA.ID);
if (i >= 0)
{
innerJoin.Add (new AB(itemA, colB[i]));
foundB[i] = true;
}
else
leftJoin.Add(itemA);
}
for (int j = 0; j < foundB.count; j++)
{
if (!foundB[j])
rightJoin.Add(colB[j]);
}
}
यह एक संभव तरीका है। यह इष्टतम है या नहीं, मुझे यकीन नहीं है, यह काम करता है।
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।
A
औरB
एक ही प्रकार के संग्रह हैं?