如何使用linq解析Dictionarys列表(List <dictionary <string,string =“”>&gt;)

时间:2015-12-15 10:14:15

标签: c# linq csv

我的情况

我写了一个有多个下拉字段的应用程序。用户可以在一个字段中选择更新其他字段的内容。 其他字段可能只有与其他字段匹配的托管。要知道什么是有效的,我使用SQL表。

实施例

ID | fruit1 |   fruit2   | taste
---------------------------------
 1 | apple  | strawberry | sweet  
 2 | banana | strawberry | sweet  
 3 | apple  | lemon      | sour
 4 | kiwi   | apple      | sour

首先,用户可以在每个字段中决定2个选项。

fruit1: "apple"/"banana"/"kiwi"
fruit2: "lemon"/"strawberry"/"apple"
color: "sweet"/"sour"

如果他选择&#34;草莓&#34;作为fruit2而不是其他领域应该只有选项,其中&#34;草莓&#34;在fruit2专栏中。

fruit1: "apple"/"banana"
fruit2: "strawberry"
color: "sweet"

问题

我目前的实施非常缓慢。每次更改后都必须有一个新查询。但是每个查询都有一个更改,导致另一个查询。延迟加起来使得这个过程非常缓慢。

我想做什么

我现在的想法是只对每个字段执行一次sqlquery(我必须这样做)。

我已经做了什么

我的第一个想法是编写第二个应用程序,从表中提取所有数据并将其放入csv文件中。 然后我必须解析该文件以获取信息。我无法使用oledb来处理文件,所以我搜索了另一种方式。 我目前正在寻找Linq来解析文件。我正在阅读文件并将其内容放入List&lt;字典&LT;字符串,字符串&gt;&gt;

我的代码

List<Dictionary<string, string>> _data = new List<Dictionary<string, string>>{new Dictionary<string, string>{{"fruit1","apple"},{"fruit2","strawberry"},{"color","red"}},new Dictionary<string, string>{{"fruit1","banana"}, {"fruit2","lemon"}, {"color","yellow"}},new Dictionary<string, string>{{"fruit1","apple"}, {"fruit2","lemon"}, {"color","green"}}};

var r = _data
    .Select(i => i.Values).Cast<Dictionary<string, string>>()
    .Where(d => d.ContainsValue("apple"));
    .SelectMany(s=>s);

导致结果为空。结果应该再次是List&lt;字典&LT; string,string&gt;&gt ;;

我的问题

执行此操作的最佳性能/可靠方式是什么?下载CSV并读取或查询并保存所有数据(就像csv一样)?
Linq查询如何能够解析List&lt;字典&LT; string,string&gt;&gt;?

3 个答案:

答案 0 :(得分:2)

考虑到你已经在字段上有索引,为什么这会很慢?它只是简单的SQL或Linq:

的查询

-SQL:

select * from myTable where fruit2 = 'Strawberry'

-Linq:

var choices = db.MyTable.Where( f => f.Fruit2 == "Strawberry" );

如果您想将所有数据传输到客户端,那么您的第一个选项可能是一个简单的列表。即:

var data = db.MyTable.ToList();

然后你可以使用Linq查询客户端:

var choices = data.Where( f => f.Fruit2 == "Strawberry");

如果要保存在列表中的数据很大,那么客户端就可以像SQLite一样保持持久性。它不需要任何安装,您可以将其数据保存到IsolatedStorage或AppData。使用CSV而不是恕我直言。您至少不能在CSV中拥有索引。

答案 1 :(得分:0)

  

如果你想要解析词典对象...

_data.Select(i => i.Values).Cast<Dictionary<string, string>>()
    .Where(d => d.ContainsValue("apple"))
    .SelectMany(s=>s).ToList().ForEach((item) =>
            {

                item.Key
                item.Value...
            });

答案 2 :(得分:0)

首先,让我们创建一个classe来表示你的表

class SampleClass
{
    public int ID { get; set; }
    public string Fruit1 { get; set; }
    public string Fruit2 { get; set; }
    public string Taste { get; set; }
}

然后,您将执行SQL查询以从表中获取日期并使用List<SampleClass>将其存储在内存中:

List<SampleClass> data = GetDataFromDatabase();

然后你必须填写下拉列表

dropDown1.Items = data.Select(d => d.Fruit1);
dropDown2.Items = data.Select(d => d.Fruit2);
dropDown3.Items = data.Select(d => d.Fruit3);

当dropdown2更改时,您可以使用linq仅过滤Fruit2 == valueInDropDown2的数据,如下所示:

//When dropDown2 change
var selectedValueInDropDown2 = "strawberry";

dropDown1.Items = data.Where(x => x.Fruit2 == selectedValueInDropDown2).Select(d => d.Fruit1);
dropDown3.Items = data.Where(x => x.Fruit2 == selectedValueInDropDown2).Select(d => d.Fruit3);