C# 折叠重复和半重复记录的代码?
我有一个此类型号的列表:C# 折叠重复和半重复记录的代码?,c#,linq,distinct,C#,Linq,Distinct,我有一个此类型号的列表: public class TourDude { public int Id { get; set; } public string Name { get; set; } } 以下是我的清单: public IEnumerable<TourDude> GetAllGuides { get { List<TourDude> guides = new List<TourDude&g
public class TourDude {
public int Id { get; set; }
public string Name { get; set; }
}
以下是我的清单:
public IEnumerable<TourDude> GetAllGuides {
get {
List<TourDude> guides = new List<TourDude>();
guides.Add(new TourDude() { Name = "Dave Et", Id = 1 });
guides.Add(new TourDude() { Name = "Dave Eton", Id = 1 });
guides.Add(new TourDude() { Name = "Dave EtZ5", Id = 1 });
guides.Add(new TourDude() { Name = "Danial Maze A", Id = 2 });
guides.Add(new TourDude() { Name = "Danial Maze B", Id = 2 });
guides.Add(new TourDude() { Name = "Danial", Id = 3 });
return guides;
}
}
目标主要是折叠重复项和接近重复项(可由ID确认),以尽可能短的值(比较时)作为名称
我从哪里开始?有没有一个完整的LINQ可以帮我做到这一点?我需要编写一个相等比较器吗
编辑1:
var result = from x in GetAllGuides
group x.Name by x.Id into g
select new TourDude {
Test = Exts.LongestCommonPrefix(g),
Id = g.Key,
};
IEnumerable<IEnumerable<char>> test = result.First().Test;
string str = test.First().ToString();
var result=来自GetAllGuides中的x
按x.Id将x.Name分组到g中
选择新TourDude{
Test=Exts.LongestCommonPrefix(g),
Id=g.键,
};
IEnumerable test=result.First().test;
字符串str=test.First().ToString();
如果要按Id
对项目进行分组,然后在每个组中查找名称
的最长通用前缀,则可以按如下操作:
var result = from x in guides
group x.Name by x.Id into g
select new TourDude
{
Name = LongestCommonPrefix(g),
Id = g.Key,
};
使用从中查找最长公共前缀的算法
结果:
{Name=“Dave Et”,Id=1}
{Name=“丹尼尔迷宫”,Id=2}
{Name=“Danial”,Id=3}
静态字符串最长公共前缀(IEnumerable xs)
{
返回新字符串(xs
.Transpose()
.TakeWhile(s=>s.All(d=>d==s.First())
.Select(s=>s.First())
.ToArray());
}
如果要按Id
对项目进行分组,然后在每个组中查找名称
的最长通用前缀,则可以按如下操作:
var result = from x in guides
group x.Name by x.Id into g
select new TourDude
{
Name = LongestCommonPrefix(g),
Id = g.Key,
};
使用从中查找最长公共前缀的算法
结果:
{Name=“Dave Et”,Id=1}
{Name=“丹尼尔迷宫”,Id=2}
{Name=“Danial”,Id=3}
静态字符串最长公共前缀(IEnumerable xs)
{
返回新字符串(xs
.Transpose()
.TakeWhile(s=>s.All(d=>d==s.First())
.Select(s=>s.First())
.ToArray());
}
我可以通过将ID上的记录分组,然后从按名称长度排序的每个组中选择第一条记录来实现这一点:
var result = GetAllGuides.GroupBy(td => td.Id)
.Select(g => g.OrderBy(td => td.Name.Length).First());
foreach (var dude in result)
{
Console.WriteLine("{{Name = {0}, Id = {1}}}", dude.Name, dude.Id);
}
我可以通过将ID上的记录分组,然后从按名称长度排序的每个组中选择第一条记录来实现这一点:
var result = GetAllGuides.GroupBy(td => td.Id)
.Select(g => g.OrderBy(td => td.Name.Length).First());
foreach (var dude in result)
{
Console.WriteLine("{{Name = {0}, Id = {1}}}", dude.Name, dude.Id);
}
AFAIK没有内置的东西可以做到这一点。您可能希望按Id分组,然后编写自己的代码来查找要使用的名称。AFAIK内置的任何东西都无法做到这一点。您可能希望按Id分组,然后编写您自己的代码以找到您想要使用的名称。在
Danial Maze A
和Danial Maze B
的情况下,这种获取名称的方式不会像Danial Maze A
和Danial Maze的情况下那样有效B
。如何从函数中获取最长的CommonPrefix?在我的edit 1 str==“System.Char[]”中,我似乎无法从所有IEnumerables中获取实际的、最长的公共前缀:\n我添加了一个longestcomonprefix
方法,该方法使用的是来自的Transpose
方法。如何将真正的x.ID用于键而不是g.Key?我的ID在现实世界中被覆盖了application@Smithy当前位置我不知道你在说什么。也许举个例子吧?对不起,我的真实世界数据使用的是另一种语言,一种我不会说的语言,我把这些列弄混了。您的示例非常完美,再次感谢:)如何从函数中获取最长的CommonPrefix?在我的edit 1 str==“System.Char[]”中,我似乎无法从所有IEnumerables中获取实际的、最长的公共前缀:\n我添加了一个longestcomonprefix
方法,该方法使用的是来自的Transpose
方法。如何将真正的x.ID用于键而不是g.Key?我的ID在现实世界中被覆盖了application@Smithy当前位置我不知道你在说什么。也许举个例子吧?对不起,我的真实世界数据使用的是另一种语言,一种我不会说的语言,我把这些列弄混了。您的示例非常完美,再次感谢:)