Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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# 基于两个可互换列的Distinct或Group By(LINQ)_C#_Linq_Distinct - Fatal编程技术网

C# 基于两个可互换列的Distinct或Group By(LINQ)

C# 基于两个可互换列的Distinct或Group By(LINQ),c#,linq,distinct,C#,Linq,Distinct,我有一份清单,上面有下列项目 我想做的是纯粹基于团队名称使用linq执行某种分组或区分。对于提供的示例,即使名称存储在记录中的不同变量中,也只会返回一条记录,因为这是相同的团队相互比赛的结果 返回哪个记录并不重要 提前谢谢你的帮助 您可以使用自定义比较器: using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args)

我有一份清单,上面有下列项目

我想做的是纯粹基于团队名称使用linq执行某种分组或区分。对于提供的示例,即使名称存储在记录中的不同变量中,也只会返回一条记录,因为这是相同的团队相互比赛的结果

返回哪个记录并不重要


提前谢谢你的帮助

您可以使用自定义比较器:

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

class Program
{
    static void Main(string[] args)
    {
        var fixtures = new List<Match> {
            new Match { Team1 = "Eagles", Team1Score = 2, Team2 = "Hawks", Team2Score = 4},
            new Match { Team1 = "Hawks", Team1Score = 1, Team2 = "Eagles", Team2Score = 2 },
        };

        var results = fixtures
            .GroupBy(x => x, new MatchComparer())
            .Select(x => new { x.Key.Team1, x.Key.Team2, Team1Total = x.Sum(s => s.Team1Score), Team2Total = x.Sum(s => s.Team2Score) });
    }
}

public class MatchComparer : IEqualityComparer<Match>
{
    public bool Equals(Match x, Match y)
    {
        return (x.Team1 == y.Team1 && x.Team2 == y.Team2) ||
            (x.Team1 == y.Team2 && x.Team2 == y.Team1);
    }

    public int GetHashCode(Match obj)
    {
        return obj.Team1.GetHashCode() + obj.Team2.GetHashCode();
    }
}

public class Match
{
    public string Team1 { get; set;}
    public int Team1Score { get; set; }
    public string Team2 { get; set; }
    public int Team2Score { get; set; }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
班级计划
{
静态void Main(字符串[]参数)
{
var fixtures=新列表{
新比赛{Team1=“老鹰”,Team1Score=2,Team2=“老鹰”,Team2Score=4},
新比赛{Team1=“鹰队”,Team1Score=1,Team2=“鹰队”,Team2Score=2},
};
var结果=固定装置
.GroupBy(x=>x,新的MatchComparer())
.Select(x=>new{x.Key.Team1,x.Key.Team2,Team1Total=x.Sum(s=>s.Team1Score),Team2Total=x.Sum(s=>s.Team2Score)});
}
}
公共类匹配比较器:IEqualityComparer
{
公共布尔等于(匹配x,匹配y)
{
返回(x.Team1==y.Team1&&x.Team2==y.Team2)||
(x.Team1==y.Team2&&x.Team2==y.Team1);
}
public int GetHashCode(匹配obj)
{
返回obj.Team1.GetHashCode()+obj.Team2.GetHashCode();
}
}
公开课比赛
{
公共字符串Team1{get;set;}
public int Team1Score{get;set;}
公共字符串Team2{get;set;}
public int Team2Score{get;set;}
}

您可以使用自定义比较器:

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

class Program
{
    static void Main(string[] args)
    {
        var fixtures = new List<Match> {
            new Match { Team1 = "Eagles", Team1Score = 2, Team2 = "Hawks", Team2Score = 4},
            new Match { Team1 = "Hawks", Team1Score = 1, Team2 = "Eagles", Team2Score = 2 },
        };

        var results = fixtures
            .GroupBy(x => x, new MatchComparer())
            .Select(x => new { x.Key.Team1, x.Key.Team2, Team1Total = x.Sum(s => s.Team1Score), Team2Total = x.Sum(s => s.Team2Score) });
    }
}

public class MatchComparer : IEqualityComparer<Match>
{
    public bool Equals(Match x, Match y)
    {
        return (x.Team1 == y.Team1 && x.Team2 == y.Team2) ||
            (x.Team1 == y.Team2 && x.Team2 == y.Team1);
    }

    public int GetHashCode(Match obj)
    {
        return obj.Team1.GetHashCode() + obj.Team2.GetHashCode();
    }
}

public class Match
{
    public string Team1 { get; set;}
    public int Team1Score { get; set; }
    public string Team2 { get; set; }
    public int Team2Score { get; set; }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
班级计划
{
静态void Main(字符串[]参数)
{
var fixtures=新列表{
新比赛{Team1=“老鹰”,Team1Score=2,Team2=“老鹰”,Team2Score=4},
新比赛{Team1=“鹰队”,Team1Score=1,Team2=“鹰队”,Team2Score=2},
};
var结果=固定装置
.GroupBy(x=>x,新的MatchComparer())
.Select(x=>new{x.Key.Team1,x.Key.Team2,Team1Total=x.Sum(s=>s.Team1Score),Team2Total=x.Sum(s=>s.Team2Score)});
}
}
公共类匹配比较器:IEqualityComparer
{
公共布尔等于(匹配x,匹配y)
{
返回(x.Team1==y.Team1&&x.Team2==y.Team2)||
(x.Team1==y.Team2&&x.Team2==y.Team1);
}
public int GetHashCode(匹配obj)
{
返回obj.Team1.GetHashCode()+obj.Team2.GetHashCode();
}
}
公开课比赛
{
公共字符串Team1{get;set;}
public int Team1Score{get;set;}
公共字符串Team2{get;set;}
public int Team2Score{get;set;}
}

我可以想到的一种方法是通过“规范化”组合键进行分组,其中规范化表示第一个键是两个键中较小的键,第二个键是较大的键:

var result = input
    .GroupBy(x => new
    {
        K1 = string.Compare(x.Team1, x.Team2) < 0 ? x.Team1 : x.Team2,
        K2 = string.Compare(x.Team1, x.Team2) < 0 ? x.Team2 : x.Team1,
    })
    .Select(g => g.First())
    .ToList();
var结果=输入
.GroupBy(x=>new
{
K1=字符串。比较(x.Team1,x.Team2)<0?x.Team1:x.Team2,
K2=字符串。比较(x.Team1,x.Team2)<0?x.Team2:x.Team1,
})
.Select(g=>g.First())
.ToList();

我可以想到的一种方法是通过“规范化”组合键进行分组,其中规范化表示第一个键是两个键中较小的键,第二个键是较大的键:

var result = input
    .GroupBy(x => new
    {
        K1 = string.Compare(x.Team1, x.Team2) < 0 ? x.Team1 : x.Team2,
        K2 = string.Compare(x.Team1, x.Team2) < 0 ? x.Team2 : x.Team1,
    })
    .Select(g => g.First())
    .ToList();
var结果=输入
.GroupBy(x=>new
{
K1=字符串。比较(x.Team1,x.Team2)<0?x.Team1:x.Team2,
K2=字符串。比较(x.Team1,x.Team2)<0?x.Team2:x.Team1,
})
.Select(g=>g.First())
.ToList();

我想说这不是要求的,是一个用户定义的方法而不是LINQ语句。我想说这不是要求的,是一个用户定义的方法而不是LINQ语句。你的信息是如何存储的,或者你在c中加载了什么?Ivan的答案会让你达到目的。最好是在将数据从db表加载到类之前进行某种字母排序,以“规范化”数据,这样您就可以使用复合键进行分组。您的信息是如何存储的,或者您在c#中加载了什么内容?Ivan的答案将帮助您实现这一点。最好是在将数据从db表加载到类之前进行某种字母排序,以“规范化”数据,这样就可以通过复合键进行分组。