我有两个linq结果,我想将它们组合在一个var中。我怎样才能做到这一点?
var xAxisconceptIdsAndName = _analysisResult.Select(x => new { x.ConceptId1, x.ConceptDisplay1 }).Distinct();
var yAxisconceptIdsAndName = _analysisResult.Select(x => new { x.ConceptId2, x.ConceptDisplay2 }).Distinct();
xAxisconceptIdsAndName返回(1,“a”),yAxisconceptIdsAndName返回(2,“b”)。我希望他们在一个结果中,如(1,“a”),(2,“b”)等。
结果:
方法 - 1:
var conceptIdsAndName = Enumerable.Union(xAxisconceptIdsAndName, yAxisconceptIdsAndName);
错误:
The type arguments for method 'System.Linq.Enumerable.Union<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
方法 - 2:
var conceptIdsAndName = xAxisconceptIdsAndName.Union(yAxisconceptIdsAndName);
错误:
'System.Collections.Generic.IEnumerable<AnonymousType#1>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.Queryable.Union<TSource>(System.Linq.IQueryable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments
Instance argument: cannot convert from 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Linq.IQueryable<AnonymousType#2>'
有什么建议吗?
答案 0 :(得分:2)
您的匿名类型具有不同的属性,因此是不同的类型。如果您在名称,类型和顺序上使属性相同,则将使用相同的类型,允许您将它们组合为该匿名类型的单个序列。
var xAxisconceptIdsAndName = _analysisResult.Select(x => new
{
ConceptId = x.ConceptId1,
ConceptDisplay = x.ConceptDisplay1
}).Distinct();
var yAxisconceptIdsAndName = _analysisResult.Select(x => new
{
ConceptId = x.ConceptId2,
ConceptDisplay = x.ConceptDisplay2
}).Distinct();
var combined = xAxisconceptIdsAndName.Concat(yAxisconceptIdsAndName);
答案 1 :(得分:1)
您需要在select语句中使用非匿名类型,这会导致类型在Union
调用中匹配。
创建一个类型来保存结果,并将其用于X轴和Y轴数据。
例如,给定:
class AxisData : IEquatable<AxisData>
{
public int Id { get; set; }
public string Display { get; set; } // Should be the type of ConceptDisplay1 & 2
// Implement IEquatable<AxisData>
}
你可以写:
var xAxisconceptIdsAndName = _analysisResult.Select(x => new AxisData { Id = x.ConceptId1, Display = x.ConceptDisplay1 }).Distinct();
var yAxisconceptIdsAndName = _analysisResult.Select(x => new AxisData { Id = x.ConceptId2, Display = x.ConceptDisplay2 }).Distinct();
然后您的Union
电话会正常运作。
答案 2 :(得分:1)
您可以使用Tuple
代替anonymous types
:
var xAxisconceptIdsAndName = _analysisResult.Select(x =>
new Tuple<int,string> (x.ConceptId1, x.ConceptDisplay1)).Distinct();
var yAxisconceptIdsAndName = _analysisResult.Select(x =>
new Tuple<int,string> (x.ConceptId2, x.ConceptDisplay2)).Distinct();
var union = xAxisconceptIdsAndName.Union(yAxisconceptIdsAndName);
编译器将anonymous types
视为不同,因此不能在Union
语句中使用