请在我遇到困难的情景中帮助我。
就是这样。
使用PropertyGrid动态创建的表和字段列表(在表内)。
BindingList<Table> table = new BindingList<Table>();
[Serializable]
[TypeConverter(typeof(TableConverter))]
public class Table {
private string _name = string.Empty;
private HeaderCollection _hc = new HeaderCollection();
private BindingList<Fields> _fc = new BindingList<Fields>();
public Guid key;
public Table() {
key = Guid.NewGuid();
}
[DisplayName( "Table Fields" ), Editor( typeof( FieldCollectionEditor ),
typeof( UITypeEditor ) )]
public BindingList<Fields> Fields {
get { return _fc; }
set { _fc = value; }
}
[DisplayName( "Table Header" )]
public HeaderCollection Headers {
get { return _hc; }
set { _hc = value; }
}
[DisplayName( "Table Name" )]
public string Name {
get { return _name; }
set { _name = value; }
}
}
字段类定义
[Serializable]
public class Fields {
private string _name = string.Empty;
public Guid Key;
private List<string> _value = new List<string>();
[Browsable( false )]
public List<string> Value {
get { return _value; }
set { _value = value; }
}
public Fields() {
Key = Guid.NewGuid();
}
[DisplayName( "Field Name" )]
public string Name {
get { return _name; }
set { _name = value; }
}
[DisplayName( "Map" )]
public bool Map {
get;
set;
}
}
字段类包含用于保存一个或多个值的字符串列表。
我的问题是:需要交叉连接所有与表中所有字段相关的值,并以表格格式显示数据。 我已经使用了这个查询,但这不起作用,因为它逐个取出值,而是我需要一次性来自所有字段的所有值的coross连接。
var result = table.SelectMany(
tbl => tbl.Fields.SelectMany(
f => f.Value.Select(v => new { i = v })));
例如, 让我们说:
F1 has Value11
F2 has Value21
F3 has Value31 and Value 32
F4 has Value41, Value42 and Value43
对于每个表和所有字段的值,结果应采用此格式。
Value11 Value21 Value 31 Value 41
Value11 Value21 Value 31 Value 42
Value11 Value21 Value 31 Value 43
Value11 Value21 Value 32 Value 41
Value11 Value21 Value 32 Value 42
Value11 Value21 Value 32 Value 43
让我再详细说明一下。例如,如果我们有
List<string> master = new List<string>();
List<string> child = new List<string>();
List<string> child1 = new List<string>();
List<string> child2 = new List<string>();
and a Linq query to fetch out
var q = from m in master
from c1 in child1
from c in child
from c2 in child2
select new { m, c, c1, c2 };
我确实需要像这样编写上面的查询来获取字段值,但问题是字段是动态生成的,因此其中的值也是如此,因此我需要某种回避方法或linq过程来提供结果,如提供的那样在上面的样本中。
答案 0 :(得分:2)
您似乎有一个结构,删除所有其他细节:
并希望得到一个结果,即所有值都跨越所有字段。我将首先在所有字段中获取所有值的集合(使用两个查询来获取两个循环):
var values = from v in (from f in Table.Fields select f.Values)
select v;
然后进行加入:
var res = from v in values
from f in Table.Fields
select new {
Field = f,
Value = v
};
答案 1 :(得分:1)
这应该涵盖第一篇文章中的主/子样本:
class Program
{
static void Main(string[] args)
{
var listofInts = new List<List<int>>(3);
listofInts.Add(new List<int>{1, 2, 3});
listofInts.Add(new List<int> { 4,5,6 });
listofInts.Add(new List<int> { 7,8,9,10 });
var temp = CrossJoinLists(listofInts);
foreach (var l in temp)
{
foreach (var i in l)
Console.Write(i + ",");
Console.WriteLine();
}
}
private static IEnumerable<List<T>> CrossJoinLists<T>(IEnumerable<List<T>> listofObjects)
{
var result = from obj in listofObjects.First()
select new List<T> {obj};
for (var i = 1; i < listofObjects.Count(); i++)
{
var iLocal = i;
result = from obj in result
from obj2 in listofObjects.ElementAt(iLocal)
select new List<T>(obj){ obj2 };
}
return result;
}
}
答案 2 :(得分:0)
感谢您立即回复 我尝试了你的方法,但仍然没有以tabluar格式获取值。让我再次澄清细节。
让我们说
Field1 has Value11
Field2 has Value21
Field3 has Value31 and Value32
Field4 has Value41, Value42 and Value43
所有这些字段都属于单一表格。
现在,在Cross加入之后,结果应如下所示。
Value11 Value21 Value31 Value41
Value11 Value21 Value31 Value42
Value11 Value21 Value31 Value43
Value11 Value21 Value32 Value41
Value11 Value21 Value32 Value42
Value11 Value21 Value32 Value43
.......
------
etc.
由于
嗡嗡