C# 如何使用StartsWith、OrderBy和GroupBy函数优化性能以筛选集合?

C# 如何使用StartsWith、OrderBy和GroupBy函数优化性能以筛选集合?,c#,list,linq,group-by,uwp,C#,List,Linq,Group By,Uwp,我有一个文本框,用于过滤由两个列表组成的集合。这两个列表都有一个公共属性,我在此基础上执行OrderBy和GroupBy 在执行这两个操作之前,我必须根据文本框中的用户输入过滤每个列表。为此,我使用StartsWith函数,然后根据公共属性组合这两个列表 我正在对文本框的文本更改事件执行的所有这些操作。我面临着大量的响应延迟,有时打字速度更快,导致应用程序崩溃。我认为OrderBy和GroupBy在过滤方面占用了大部分时间 这是我的密码: private void locationsearchb

我有一个文本框,用于过滤由两个列表组成的集合。这两个列表都有一个公共属性,我在此基础上执行OrderBy和GroupBy

在执行这两个操作之前,我必须根据文本框中的用户输入过滤每个列表。为此,我使用StartsWith函数,然后根据公共属性组合这两个列表

我正在对文本框的文本更改事件执行的所有这些操作。我面临着大量的响应延迟,有时打字速度更快,导致应用程序崩溃。我认为OrderBy和GroupBy在过滤方面占用了大部分时间

这是我的密码:

private void locationsearchboxrecipient_TextChanged(object sender, TextChangedEventArgs e)
    {
        var recipientFilteredDataByPlaces = new List<Table_Places>();
        var recipientFilteredDataByPersons = new List<Table_People>();

        if (locationsearchboxrecipient.Text.Length == 0)
        {
            cvrbyplace.Source = recipientFilteredDataByPlaces;
            cvrbyperson.Source = recipientFilteredDataByPersons;
            return;
        }

        if (PeopleList != null)
        {
            foreach (var item in PeopleList)
            {
                if (item.FirstName.StartsWith(locationsearchboxrecipient.Text, StringComparison.OrdinalIgnoreCase) || item.AccountNumber.StartsWith(locationsearchboxrecipient.Text, StringComparison.OrdinalIgnoreCase) || item.MiddleName.StartsWith(locationsearchboxrecipient.Text, StringComparison.OrdinalIgnoreCase) || item.LastName.StartsWith(locationsearchboxrecipient.Text, StringComparison.OrdinalIgnoreCase))
                {
                    item.Icon = "../Assets/user_profile.png";
                    recipientFilteredDataByPersons.Add(item);
                }
            }
            }

        if (PlacesList != null)
        {

            foreach (var item in PlacesList)
            {
                if (item.AccountNumber.StartsWith(locationsearchboxrecipient.Text, StringComparison.OrdinalIgnoreCase) || item.Name.StartsWith(locationsearchboxrecipient.Text, StringComparison.OrdinalIgnoreCase))
                {
                    item.Icon = "../Assets/ic_location.png";
                    recipientFilteredDataByPlaces.Add(item);
                }
            }

        }

        List<IFirstName> combinePlacePerson = (from x in recipientFilteredDataByPersons select (IFirstName)x).ToList();
        combinePlacePerson.AddRange((from x in recipientFilteredDataByPlaces select (IFirstName)x).ToList());
        cvrbyperson.Source = combinePlacePerson.OrderBy(x => x.FirstName, StringComparer.OrdinalIgnoreCase).GroupBy(x => x.FirstName[0].ToString().ToUpper(), StringComparer.OrdinalIgnoreCase);

    }
private void location searchboxrecipient\u TextChanged(对象发送者,textchangedventargs e)
{
var RecipientFilteredatabyPlaces=新列表();
var recipientFilteredatabypersons=new List();
if(locationsearchboxrecipient.Text.Length==0)
{
cvrbyplace.Source=RecipientFilteredDataTablePlaces;
cvrbyperson.Source=RecipientFilteredDataTypersons;
返回;
}
if(PeopleList!=null)
{
foreach(人员列表中的变量项)
{
if(item.FirstName.StartsWith(locationsearchboxrecipient.Text,StringComparison.OrdinalIgnoreCase)| item.AccountNumber.StartsWith(locationsearchboxrecipient.Text,StringComparison.OrdinalIgnoreCase)| item.LastName.StartsWith(locationsearchboxrecipient.Text,StringComparison.OrdinalIgnoreCase))
{
item.Icon=“../Assets/user_profile.png”;
RecipientFilteredDataTypeSons.Add(项);
}
}
}
如果(PlacesList!=null)
{
foreach(位置列表中的var项目)
{
if(item.AccountNumber.StartsWith(locationsearchboxrecipient.Text,StringComparison.OrdinalingOreCase)| | item.Name.StartsWith(locationsearchboxrecipient.Text,StringComparison.OrdinalingOreCase))
{
item.Icon=“../Assets/ic_location.png”;
RecipientFilteredDataTablePlaces.Add(项目);
}
}
}
列表combinePlacePerson=(从RecipientFilteredDataTypersons选择(IFirstName)x中的x开始);
combinePlacePerson.AddRange((从RecipientFilteredDataTablesSelect(IFirstName)x.ToList()中的x开始);
cvrbyperson.Source=combinePlacePerson.OrderBy(x=>x.FirstName,StringComparer.OrdinalingOreCase).GroupBy(x=>x.FirstName[0].ToString().ToUpper(),StringComparer.OrdinalingOreCase);
}
PeopleList和PlacesList是List对象,包含近7k条记录。 cvrbyperson是我绑定到列表的UI的集合视图源对象


我非常感谢您的帮助。

考虑以下几点:

1尝试延迟过滤的执行。在每次击键时执行此逻辑是不必要的,因为当前状态将丢弃旧状态,用户甚至不会注意到建议。将过滤延迟150毫秒-200毫秒是可以接受的(你应该调整它,看看什么是最合适的)。查看并找到解决方案


2要快速开始搜索,您可以使用前缀树->
Trie
。dotnet有几个金块包。我已经使用了一些稳定的包。如果您使用
Person
Place
等对象中感兴趣的所有字段创建Trie的预定义实例,例如
>Name
AccountNumber
…等等,它应该非常快。

您是否考虑过该事件,以便在键入时获得更好的感知响应?另外,为什么在比较字符串与
StringComparer.OrdinalIgnoreCase
时使用
ToUpper
?这是多余的。我会去掉
ToUpper
,因为它将用于c创建每个字符串的副本。这可能是性能问题的很大一部分。假设您的列表包含在数据库中,为什么要在内存中执行此操作,而不是让数据库执行繁重的操作?您的代码执行此操作的速度永远不会比数据库优化器快。@BradleyUffner很抱歉回复得太晚。@我真的不知道在我现有的代码中在哪里使用节流功能。