Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 折叠重复和半重复记录的代码?_C#_Linq_Distinct - Fatal编程技术网

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当前位置我不知道你在说什么。也许举个例子吧?对不起,我的真实世界数据使用的是另一种语言,一种我不会说的语言,我把这些列弄混了。您的示例非常完美,再次感谢:)