我有 IEnumerable Type1 和 Type2 ,即。 IEnumerable<Type1>
&amp; IEnumerable<Type2>
。 Type1和Type2有1个公共字段,称为 TypeID 。 IEnumerable<Type2>
中可能存在多个相同的TypeID,我想检查2个IEnumebles,如果 Type2 中的 TypeID 等于 TypeID 在 Type1 里面,我会将2组合成一个新对象。如果不是,则新对象仅将IEnumerable<Type2>
设置为null
。这有点让人困惑,所以我添加了一个伪代码来更好地展示我想要实现的目标:
namespace test
{
public class ConfigMetaDataColumns
{
public int FieldID { get { return ValueInt("FieldID"); } }
public string Label { get { return ValueString("Label"); } }
public string FieldName { get { return ValueString("FieldName"); } }
}
public class ConfigDataColumns
{
public int FieldID { get { return ValueInt("FieldID"); } }
public double NumericValue { get { return ValueDouble("NumericValue"); } }
}
public class ConfigMetaDataCombinedColumns
{
public ConfigMetaDataColumns ConfigMetaData { get; set; }
public IEnumerable<ConfigDataColumns> ConfigData { get; set; }
}
public class GetCombinedData
{
// Get ConfigMetaData
private IEnumerable<ConfigMetaDataColumns> GetConfigMetaData()
{
var requester = GetConfigMetaDataMethodHere();
return requester.Items;
}
// Get ConfigMeta
private IEnumerable<ConfigMetaDataColumns> GetConfigMetaData()
{
var requester = GetConfigDataMethodHere();
return requester.Items;
}
// Combine the two here!
private IEnumerable<ConfigMetaDataCombinedColumns> GetData()
{
/*
* ConfigMetaDataColumns example:
* FieldID: 1
* Label: Label1
* FieldName: FieldName1
*
* FieldID: 2
* Label: Label2
* FieldName: FieldName2
*
* FieldID: 3
* Label: Label3
* FieldName: FieldName3
* */
/*
* ConfigDataColumns example:
* FieldID: 1
* NumericVal: NumericVal1
* FieldID: 1
* NumericVal: NumericVal2
* FieldID: 3
* NumericVal: NumericVal3
* */
/*
* Cobined data should be:
*
* FieldID: 1
* Label: Label1
* FieldName: FieldName1
{* FieldID: 1
* NumericVal: NumericVal1
* FieldID: 1
* NumericVal: NumericVal2}
*
* FieldID: 2
* Label: Label2
* FieldName: FieldName2
{* NULL *}
*
* FieldID: 3
* Label: Label3
* FieldName: FieldName3
{* FieldID: 3
* NumericVal: NumericVal3}
* */
}
}
}
谢谢。
答案 0 :(得分:3)
如果我正确地阅读了您的问题,您所需要的只是左连接。
示例:
class Foo
{
public int SomeId { get; set; }
}
class Bar
{
public int SomeId { get; set; }
}
class FooWithBars
{
public Foo Foo { get; set; }
public IEnumerable<Bar> Bars { get; set; }
}
...
List<Foo> foos = new List<Foo>();
List<Bar> bars = new List<Bar>();
foos.Add(new Foo() { SomeId = 1 });
foos.Add(new Foo() { SomeId = 2 });
bars.Add(new Bar() { SomeId = 1 });
bars.Add(new Bar() { SomeId = 1 });
// get all foos and matching bars
var combined = from foo in foos
join bar in bars
on foo.SomeId equals bar.SomeId into g
select new FooWithBars
{
Foo = foo,
Bars = g.Any() ? g : null
};
在此示例中,根据您的要求,您将获得IEnumerable<Bar>
或null。
答案 1 :(得分:0)
完全猜测......但我认为这就是你想要的:
private IEnumerable<ConfigMetaDataCombinedColumns> ReturnMe()
{
var query = from meta in GetConfigMetaData().AsQueryable()
join data in GetConfigDataColumns().AsQueryable()
on meta.FieldID equals data.FieldID
select new {
ConfigMetaDataColumns = meta,
ConfigDataColumns = data
};
return from item in query
group item by item.ConfigMetaDataColumns into l
select new ConfigMetaDataCombinedColumns()
{
ConfigMetaData = l.Key,
ConfigData = l.Select(x=>x.ConfigDataColumns)
} ;
}
答案 2 :(得分:0)
我认为应该这样做。不是最有效的,但您可以改进它将数据提取函数的结果存储在变量中:
IEnumerable<ConfigMetaDataCombinedColumns> combined =
GetConfigMetaData()
.Select(p=> new ConfigMetaDataCombinedColumns() {ConfigMetaData = p
, ConfigData = GetConfigData().Where(q=>q.FieldID == p.FieldID) });
答案 3 :(得分:0)
我相信使用ResultSelector连接调用GetData方法,但将对象作为参数传递,将对您有用。
//IEnumerable<Type1> List1
//IEnumerable<Type2> List2
var result = List1.Join( List2, a => a.TypeId, b => b.TypeId, (a, b) => GetData(a, b));
//do something with result