如何创建包含多列的字典

时间:2014-03-09 16:31:24

标签: windows-phone-8 dictionary collections

我正在开发一个Windows Phone 8应用程序,我有一些我需要处理的数据。我正在阅读网站上的数据,我基本上有4条来自网站的信息。我需要能够在显示之前对这些数据进行一些解析和过滤,所以我想将它添加到某种数组/集合/字典中。

在使用C#WinForms应用程序之前,我只想在内存中创建一个包含4列的DataTable,并为每个条目添加一行。我不认为我可以在Windows Phone上使用DataTables,所以我想知道我可以在内存中存储这些信息的其他方法。该应用程序不存储任何信息,因此我没有必要使用IsolatedStorage进行任何此操作。

我可以使用哪种字典/集合来执行类似于DataTable的操作吗?因为它会让我每次存储4条信息?

谢谢!

2 个答案:

答案 0 :(得分:0)

这是XAML的一些开放性问题(因为你真的在问如何使用集合控件以及如何进行绑定)。

基本上,任何集合都可以,然后使用控件绑定到该集合中元素的各种属性。您可以使用ListBox控件,将其绑定到集合,然后在其中声明ItemTemplate以绑定到集合中元素内的各种属性。

<ListBox ItemsSource="{Binding Customers}" Margin="0,5,0,10">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" >
                <TextBlock Padding="3,0,3,0"
      Text="{Binding FirstName}" FontSize="{StaticResource PhoneFontSizeSmall}"/>
                <TextBlock Text="{Binding LastName}" FontSize="{StaticResource PhoneFontSizeSmall}"/>
                <TextBlock Text=", " FontSize="{StaticResource PhoneFontSizeSmall}"/>
                <TextBlock Text="{Binding Address}" FontSize="{StaticResource PhoneFontSizeSmall}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

您可以设置页面的DataContext(或将ListBox命名为 DataContext)到具有名为{的属性的对象{1}}您要在列表框中查看的集合,例如:

Customers

我忽略了public MyPage() { //... DataContext = this; } public List<Customer> Customers {get;set;} ,我会将其作为练习留给读者。

答案 1 :(得分:0)

如果你需要简单的东西,你可以创建一个保存数据的类:

public class DataFromWebSite
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Country { get; set; }
    public string Telephone { get; set; }
}

在上面的例子中,我使用了一个强类型类,其中每个属性都可以包含精确的值/数据类型。因此,Ageinteger,而不是string

然后,我将创建一个集合对象来保存值:

var list = new ObservableCollection<DataFromWebSite>();

// add items to the list...
list.Add(new DataFromWebSite
{
    Name = "John",
    Age = 42,
    Country = "Antartica",
    Telephone = "941223445"
});
list.Add(new DataFromWebSite
{
    Name = "Carrol",
    Age = 24,
    Country = "Atlantis",
    Telephone = "100223445"
});

ObservableCollection适用于UI,其中列表可能会随时间而变化。例如,绑定到ObservableCollection的ListBox会在添加或删除项目时显示对列表的更改(但如果没有实现Age,则不会显示INotifyPropertyChange等属性的更改)。

然后,使用一些LINQ扩展,您可以执行简单/可读的查询:

var greaterThan30 = list.Where(d => d.Age > 30);
foreach (var item in greaterThan30)
{
    Debug.WriteLine("{0}-{1}", item.Name, item.Age);
}

上面会生成一个列表,其中只有Age属性大于30的对象。

或者您可以使用LINQ:

var greaterThan30 = from d in list
                     where d.Age > 30
                     select d;

如果返回的其中一个值是唯一的(例如ID):

public class DataFromWebSite
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Telephone { get; set; }
}

您可以将列表存储为Dictionary<string, DataFromWebSite>

var keyed = new Dictionary<string, DataFromWebSite>();
var d = new DataFromWebSite
{
    Id = "ABC123-A";
    Name = "John",
    Age = 42,
    Telephone = "941223445"
};

keyed.Add(d.Id, d);
// to get a value back:
if (keyed.ContainsKey("ABC123-A")) {
    var d2 = keyed["ABC123-A"];
}

而且,如果你想从词典中获取列表:

var list = keyed.Values.ToArray();