C# 将列表转换为字典C

C# 将列表转换为字典C,c#,asp.net,entity-framework,linq,C#,Asp.net,Entity Framework,Linq,我已经使用Linq实现了一个搜索选项,其工作原理如下: string[] str = txtSearch.Text.Replace(" ", "").Split(','); var con = (from c in context.Customer join d in context.CustomerType on c.CustType equals d.ID where str.Any(t => c.CustName.Contains(t))

我已经使用Linq实现了一个搜索选项,其工作原理如下:

string[] str = txtSearch.Text.Replace(" ", "").Split(',');

var con = (from c in context.Customer
           join d in context.CustomerType on c.CustType equals d.ID
           where str.Any(t => c.CustName.Contains(t))
           select new { c.CustomerID, c.CustName, c.CustAddress, d.Type }).ToList();

grdDetails.DataSource = con;
grdDetails.DataBind();
但我听说字典对于查找而不是列表非常有效。因此,我尝试执行以下操作,但没有得到任何数据显示:

编辑:我为Dictionary编辑了以下内容,但似乎如果我使用EF,我必须循环列表才能使用Dictionary。顺便说一下,这两本词典中的键之间没有关系。所以我想,虽然用另一种方法尝试,但不会有查找。这是有效的,但我想知道这是否是一个好的做法

var dictionary = new Dictionary<int, Customer>();
dictionary.Add(1, new Customer() { CustomerID = 1, CustName = "AT", CustType = 1 });
dictionary.Add(2, new Customer() { CustomerID = 2, CustName = "AT-2017", CustType = 1 });
dictionary.Add(3, new Customer() { CustomerID = 3, CustName = "Jackson", CustType = 1 });
dictionary.Add(4, new Customer() { CustomerID = 4, CustName = "Anderson", CustType = 1 });

var dictionary2 = new Dictionary<int, CustomerType>();
dictionary2.Add(1, new CustomerType() { ID = 1, Type = "Active" });

//dictionary.Keys.Where(key => key.Contains("AT")).ToList();

var con = (from c in dictionary
           join d in dictionary2 on c.Value.CustType equals d.Value.ID 
           where str.Any(t => c.Value.CustName.Contains(t))
           select new { c.Value.CustomerID, c.Value.CustName, d.Value.Type }).ToList();

grdDetails.DataSource = con;
grdDetails.DataBind();
我试图遵循一个教程,在最后将字典转换为列表。但我不确定它为什么这样做。因此,我想知道上述方法是否是使用字典进行搜索的最佳方法


注意:我在控制台应用程序中使用了Dictionary,我理解它是如何工作的。但是使用字典进行连接有点困惑。

查询的输出仍然是一个列表,所以我很惊讶con.Values会编译

另外,第二个代码示例正在两个已初始化但未填充的字典上运行查询,因此没有数据是正确的结果


我怀疑如果您的第一个代码示例与数据库相反,那么它会更好。它将使用数据库的优化来运行查询并返回结果。首先将所有内容加载到内存中,然后运行查询,这真的没有任何好处。

在您的第一个代码块中,为什么要将CustType加入ID?在c.CustType上等于d.ID,这似乎没有什么意义。似乎您正在处理EF或某种类型的Linq-to-SQL提供程序,在这种情况下,您的Linq代码只是转换为SQL,容器的类型并不重要。谢谢@juharr的回复。对我正在使用EF。那么,你的意思是不需要使用字典,还是不需要使用字典?我想知道我是否可以用字典实现上面的功能。只是想澄清一下。首先,加入两个空字典总是会返回空结果。第二,一旦你有了一个字典,使用LINQ join没有任何好处,因为字典本身非常适合快速查找,而且LINQ join不会使用它,所以如果你使用了列表、数组或LINQ to Objects查询,基本上都是一样的。我已经编辑了我的答案@Ivan Stoev。看看这是否更接近我所寻找的方式。谢谢你的评论。字典运行正常,并通过以上编辑获取数据。非常感谢@MikeS。我这样做是为了数据库操作或关于数据库。我能理解这个查询可以使用。但我很想知道我是否能用这本字典。顺便说一句,我使用的是EF。如果你想从你的查询中创建一个字典,有一个ToDictionary方法,它接受将形成每个条目的键和值的表达式。你可以用这个替换你的列表。我已经编辑了我的答案@MikeS。这本词典很有效,并且可以获取数据,但看看这是否更接近我所寻找的方式。再次感谢您的评论。