C# 如何对Xamarin表单中的列表进行分组?

C# 如何对Xamarin表单中的列表进行分组?,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我需要在xamarin表单中将下面的列表分组,并在ListView中显示公司名称。我已经研究过,通过可观测的收集,这是可能的。但我不知道怎么做。谁能帮我实现这个目标 列表 public class Phone { public string Title { get; set; } public string Company { get; set; } public int Price { get; set; } } var phones = new List<P

我需要在xamarin表单中将下面的列表分组,并在ListView中显示公司名称。我已经研究过,通过可观测的收集,这是可能的。但我不知道怎么做。谁能帮我实现这个目标

列表

public class Phone
{
    public string Title { get; set; }
    public string Company { get; set; }
    public int Price { get; set; }
} 

var phones = new List<Phone>
            {
                new Phone {Title="Galaxy S8", Company="Samsung", Price=60000 },
                new Phone {Title="Galaxy S7 Edge", Company="Samsung", Price=50000 },
                new Phone {Title="Huawei P10", Company="Huawei", Price=10000 },
                new Phone {Title="Huawe Mate 8", Company="Huawei", Price=29000 },
                new Phone {Title="iPhone 7", Company="Apple", Price=38000 },
                new Phone {Title="iPhone 6S", Company="Apple", Price=50000 }
            };

您可以尝试以下代码段

var list=    phones.GroupBy(item => item.Company)
     .Select(group => new { Company= group.Key, Items = group.ToList() })
     .ToList();
请尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {


             var phones = new List<Phone> {
                new Phone {Title="Galaxy S8", Company="Samsung", Price=60000 },
                new Phone {Title="Galaxy S7 Edge", Company="Samsung", Price=50000 },
                new Phone {Title="Huawei P10", Company="Huawei", Price=10000 },
                new Phone {Title="Huawe Mate 8", Company="Huawei", Price=29000 },
                new Phone {Title="iPhone 7", Company="Apple", Price=38000 },
                new Phone {Title="iPhone 6S", Company="Apple", Price=50000 }
            };

             var groups = phones.GroupBy(x => x.Company);

             foreach (var group in groups)
             {
                 Console.WriteLine(group.Key);
                 foreach (Phone phone in group)
                 {
                     Console.WriteLine("Title : {0}", phone.Title);
                     Console.WriteLine("Price : {0}", phone.Price);
                     Console.WriteLine();
                 }
             }

             Console.ReadLine();

        }
    }
    public class Phone
    {
        public string Title { get; set; }
        public string Company { get; set; }
        public int Price { get; set; }
    } 
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
var=新列表{
新手机{Title=“Galaxy S8”,Company=“Samsung”,价格=60000},
新手机{Title=“Galaxy S7 Edge”,Company=“Samsung”,价格=50000},
新手机{Title=“华为P10”,Company=“华为”,价格=10000},
新手机{Title=“Huawe Mate 8”,Company=“华为”,价格=29000},
新手机{Title=“iphone7”,Company=“Apple”,Price=38000},
新手机{Title=“iphone6s”,Company=“Apple”,价格=50000}
};
var groups=phones.GroupBy(x=>x.Company);
foreach(组中的var组)
{
控制台写入线(组键);
foreach(组中的电话)
{
Console.WriteLine(“Title:{0}”,phone.Title);
Console.WriteLine(“Price:{0}”,phone.Price);
Console.WriteLine();
}
}
Console.ReadLine();
}
}
公用电话
{
公共字符串标题{get;set;}
公共字符串公司{get;set;}
公共整数价格{get;set;}
} 
}

您需要创建一个模型,该模型包含一个分组,其中一个键将用作标题(以及分组依据的值)和实际模型

我在上面创建了如下内容:

public class PhoneGroup : ObservableCollection<Phone>
{
    public string Name { get; private set; }

    public PhoneGroup(string name)
        : base()
    {
        Name = name;
    }

    public PhoneGroup(string name, IEnumerable<Phone> source)
        : base(source)
    {
        Name = name;
    }
}
现在将
ListView
添加到您的页面,我已经在XAML中完成了,并将
ItemsSource
配置到您定义的集合中。要启用分组,还可以像下面的代码中那样设置
IsGroupingEnabled
GroupDisplayBinding
属性

<ListView ItemsSource="{Binding PhonesList}" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Name}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextCell Text="{Binding Title}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
GetData
是用JSON检索数据的调用,我们清除列表以替换所有内容,然后循环检查组(本例中的公司)是否已经存在。如果没有,我们将创建组并添加当前电话


这不是最有效的方法,但我认为目前最清楚的解释方法。

希望这有助于创建JSON并从中加载,控制台?这是一个Xamarin.Forms应用程序!此代码将列表分组。但是如何在Xamarin表单中的Listview中分配这些内容呢?@Ganeshgm7看看这篇文章当我为不同的组添加了数据时,上面的代码是有效的。但在我的例子中,我将获得JSON格式的数据,比如Title=“Galaxy S8”,Company=“Samsung”,Price=60000,我需要根据运行时已知的公司进行分组。我得到了列表中的数据。但我不知道如何处理收藏。有什么想法吗?
PhonesList.Add(new PhoneGroup("Apple", new[]{ new Phone
            {
                Title = "iPhone 6s",
                Price = 50000
            },
            new Phone
            {
                Title = "iPhone 7",
                Price = 38000
            }}));
<ListView ItemsSource="{Binding PhonesList}" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Name}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextCell Text="{Binding Title}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
var phonesResult = GetData();

PhonesList.Clear();
foreach (var phone in phonesResult)
{
    if (!PhonesList.Any(company => company.Name == phone.Company))
        PhonesList.Add(new PhoneGroup(phone.Company));

    PhonesList.Single(company => company.Name == phone.Company).Add(phone);
}