मैं सोच रहा हूं कि क्या लिंकपैड में ऊपर से नीचे की बजाय दो क्वेरी परिणाम एक साथ प्रदर्शित करना संभव है? यानी एक ही रिकॉर्ड दो अलग-अलग प्रश्नों के साथ खींचा गया ताकि मैं डेटा की तुलना करने के लिए कंधे से कंधा मिलाकर देख सकूं?

1
John S 21 जुलाई 2018, 00:08
आप परिणामों को एक IEnumerable यानी join का उपयोग करके जोड़ सकते हैं? क्या यह सिर्फ एक रिकॉर्ड या रिकॉर्ड की तालिका है?
 – 
NetMage
21 जुलाई 2018, 01:10

2 जवाब

कुछ विस्तार विधियों का उपयोग करके, आप किसी भी Object को एक Dictionary<string,object> में बदल सकते हैं जो फ़ील्ड और गुणों और उनके मूल्यों का प्रतिनिधित्व करता है। तब आप उनसे जुड़ सकते हैं।

Type और MemberInfo पर कुछ विस्तार विधियां संपत्तियों और क्षेत्रों के साथ मिलकर काम करना आसान बनाती हैं:

public static class TypeExt {
    public static MemberInfo[] GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
        t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field | mi.MemberType == MemberTypes.Property).ToArray();
}

public static class MemberInfoExt {
    public static object GetValue(this MemberInfo member, object srcObject) {
        switch (member) {
            case FieldInfo mfi:
                return mfi.GetValue(srcObject);
            case PropertyInfo mpi:
                return mpi.GetValue(srcObject);
            default:
                throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", nameof(member));
        }
    }
}

उन सहायकों के साथ, आप एक object को एक Dictionary<string,object> में बदल सकते हैं:

public static class ObjectExt {
    public static IDictionary<string, object> ToDictionary(this object item) {
        if (item is IDictionary<string, object> id)
            return id;
        else {
            var dictAnsObj = new Dictionary<string, object>();

            foreach (var prop in item.GetType().GetPropertiesOrFields()) {
                try {
                    dictAnsObj.Add(prop.Name, prop.GetValue(item));
                }
                catch (Exception ex) {
                    dictAnsObj.Add(prop.Name, ex);
                }
            }

            return dictAnsObj;
        }
    }

    public class SideBySideClass {
        public string Key;
        public object Left;
        public object Right;
    }

    public static IEnumerable<SideBySideClass> SideBySide(this object left, object right) {
        return left.ToDictionary()
                   .Join(right.ToDictionary(),
                         kvp => kvp.Key,
                         kvp => kvp.Key,
                         (l, r) => new SideBySideClass() { Key = l.Key, Left = l.Value, Right = r.Value })
                   .OrderBy(sxs => sxs.Key);
    }
}

object के दो शब्दकोशों में परिवर्तित होने के साथ, उन्हें सदस्य नामों पर शामिल करना आसान है और फिर LINQPad उन्हें साथ-साथ आउटपुट करेगा। यदि r1 और r2 आपके एकल रिकॉर्ड हैं, तो:

r1.SideBySide(r2).Dump();

उन्हें कंधे से कंधा मिलाकर आउटपुट देगा।

कुछ छोटे बदलावों का उपयोग करके आप यह दिखाने के लिए एक और कॉलम जोड़ सकते हैं कि कौन से मान भिन्न हैं।

आप कुछ आईडी फ़ील्ड पर रिकॉर्ड के दो सेट join भी कर सकते हैं और उन्हें साथ-साथ आउटपुट कर सकते हैं। यहाँ उसके लिए एक विस्तार विधि है:

public static IEnumerable<IEnumerable<SideBySideClass>> SidesBySides<T, TKey>(this IEnumerable<T> lefts, IEnumerable<T> rights, Func<T,TKey> keyFn) =>
    lefts.Join(rights, keyFn, keyFn, (l, r) => l.SideBySide(r));
0
NetMage 21 जुलाई 2018, 02:08

एक हल्का विकल्प उनमें से एक टुपल सरणी बनाना और वहां से जाना है:

Person a = GetA();
Person b = GetB();

Tuple<Person, Person> tup = new Tuple<Person, Person>(a, b);
Tuple<Person, Person>[] tupArray = new[] { tup };
tupArray.Dump(1);
0
sean.net 6 नवम्बर 2019, 15:52