我想知道是否可以在LinqPad中并排显示两个查询结果,而不是从上到下显示吗? 即同一条记录具有两个不同的查询,以便我可以并排查看以比较数据?
答案 0 :(得分:0)
使用某些扩展方法,您可以将任何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();
将它们并排输出。
使用一些小的更改,您可以添加另一列以显示哪些值不同。
您也可以在某个id字段上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));
答案 1 :(得分:0)
一种轻巧的选择是将它们制成一个Tuple数组,然后从那里开始:
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);