gpt4 book ai didi

c# - 搜索列表并按最大找到的值排序列表 c#

转载 作者:太空宇宙 更新时间:2023-11-03 20:24:26 25 4
gpt4 key购买 nike

我想承认我在 LINQ 方面很弱。我有数据列表。我想按给定值搜索列表拳头,然后按最大出现次数对数据进行排序,这是行中出现的最长时间。

        List<SearchResult> list = new List<SearchResult>() { 
new SearchResult(){ID=1,Title="Cat"},
new SearchResult(){ID=2,Title="dog"},
new SearchResult(){ID=3,Title="Tiger"},
new SearchResult(){ID=4,Title="Cat"},
new SearchResult(){ID=5,Title="cat"},
new SearchResult(){ID=6,Title="dog"},
};

如果我用"dog cat"这样的数据搜索和排序列表,那么输出会像

ID=1,Title=Cat
ID=4,Title=Cat
ID=5,Title=Cat
ID=2,Title=dog
ID=6,Title=dog

all cat 会先出现,因为这个 cat 关键字在所有行中找到了最大时间,然后是 dog 找到了最大时间。

下面的数据不会出现,因为它不在搜索词中

ID=3,Title=Tiger

寻找解决方案。谢谢

更新部分代码

        List<SearchResult> list = new List<SearchResult>() { 
new SearchResult(){ID=1,Title="Geo Prism 1995 - ABS #16213899"},
new SearchResult(){ID=2,Title="Excavator JCB - ECU P/N: 728/35700"},
new SearchResult(){ID=3,Title="Geo Prism 1995 - ABS #16213899"},
new SearchResult(){ID=4,Title="JCB Excavator - ECU P/N: 728/35700"},
new SearchResult(){ID=5,Title="Geo Prism 1995 - ABS #16213899"},
new SearchResult(){ID=6,Title="dog"},
};

var to_search = new[] { "Geo", "JCB" };
var result = list.Where(sr => to_search.Any(ts => String.Compare(ts, sr.Title, StringComparison.OrdinalIgnoreCase) == 0))
.GroupBy(sr => sr.Title.ToLower())
.OrderByDescending(g => g.Count());

var matched = result.SelectMany(m => m);

var completeList = matched.Concat(list.Except(matched));

dataGridView2.DataSource = completeList.ToList();

我尝试在其他应用程序中使用您的逻辑,但它不起作用。根据逻辑,三行首先带有 GEO 关键字,然后接下来的两行带有 JCB,然后是无与伦比的其余部分。我需要更改您的代码。请帮忙。谢谢

最佳答案

这将过滤您的列表并按 Title 对其进行分组,并按大小对组进行排序。

List<SearchResult> list = new List<SearchResult>() { 
new SearchResult(){ID=1,Title="Cat"},
new SearchResult(){ID=2,Title="dog"},
new SearchResult(){ID=3,Title="Tiger"},
new SearchResult(){ID=4,Title="Cat"},
new SearchResult(){ID=5,Title="cat"},
new SearchResult(){ID=6,Title="dog"},
};

var to_search = new[] { "cat", "dog" };

var result = list.Where(sr => to_search.Any(ts => String.Compare(ts, sr.Title, StringComparison.OrdinalIgnoreCase) == 0))
.GroupBy(sr => sr.Title.ToLower())
.OrderByDescending(g => g.Count());

foreach (var group in result)
foreach (var element in group)
Debug.WriteLine(String.Format("ID={0},Title={1}", element.ID, element.Title));

输出:

ID=1,Title=Cat
ID=4,Title=Cat
ID=5,Title=cat
ID=2,Title=dog
ID=6,Title=dog

如果您不关心实际分组,只需使用 SelectMany 展平组列表即可.

(请注意,此代码将忽略 Title 的大小写。我不知道这是您想要的还是代码中的错字:您正在使用 catCat,并且在您的输出中它只是 Cat,但是 dog 没有大写。)

编辑:

要获取不匹配的项目,您可以使用Except :

var unmatched = list.Except(result.SelectMany(m => m)); // beware! contains the tiger!

编辑 2:

var result = list.Where(sr => to_search.Any(ts => String.Compare(ts, sr.Title, StringComparison.OrdinalIgnoreCase) == 0))
.GroupBy(sr => sr.Title.ToLower())
.OrderByDescending(g => g.Count());

var matched = result.SelectMany(m => m);

var completeList = matched.Concat(list.Except(matched));

foreach (var element in completeList)
Debug.WriteLine(String.Format("ID={0},Title={1}", element.ID, element.Title));

输出

ID=1,Title=Cat
ID=4,Title=Cat
ID=5,Title=cat
ID=2,Title=dog
ID=6,Title=dog
ID=3,Title=Tiger

编辑3

var result = from searchResult in list
let key_string = to_search.FirstOrDefault(ts => searchResult.Title.ToLower().Contains(ts.ToLower()))
group searchResult by key_string into Group
orderby Group.Count() descending
select Group;

关于c# - 搜索列表并按最大找到的值排序列表 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11395704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com