为了账号安全,请及时绑定邮箱和手机立即绑定

C# 查询键值列表并查找重复项

C# 查询键值列表并查找重复项

C#
回首忆惘然 2022-06-12 10:28:30
我在 c# 中有一个列表:List<Data> uData = new List<uData>();其中 uData 从 UI 填充为:{   Id: 1,   Name: "Smith",   Input: "7,8",   Output: "Output1",   CreatedBy: "swallac",   CreatedON: "12/01/2018"},{   Id: 2,   Name: "Austin",   Input: "7,8",   Output: "Output1",   CreatedBy: "awanda",   CreatedON: "12/03/2018"},{   Id: 1,   Name: "Smith",   Input: "22,22",   Output: "Output2",   CreatedBy: "swallac",   CreatedON: "12/01/2018"},{   Id: 1,   Name: "Smith",   Input: "9,8",   Output: "Output2",   CreatedBy: "swallac",   CreatedON: "12/01/2018"},{   Id: 1,   Name: "Peter",   Input: "1,10",   Output: "Output3",   CreatedBy: "pjon",   CreatedON: "12/02/2018"}我想要做的是在“输出”键上搜索这个列表,并找出“输入”键的相应值是否有重复项。例如,在我上面的示例列表中,我有三个输出:Output1、Output2、Output3。现在对于输出值为“Output1”的键的列表,相应的“输入”键在此处重复。值为“7,8”。这是我要强调的。所以 Output1 具有 Output2 和 Output3 没有的重复输入。我可以像下面这样首先找出输出然后检查值:var myList = uData.Where(p => p.Output == "Output").First();但我不会提前知道所有的输出来检查。有什么可以开始的输入吗?
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您可以获得重复项的列表,如下所示:

var myList = uData.GroupBy(l => l.Ouput)
                  .SelectMany(g => g.GroupBy(x => x.Input).Where(x => x.Count() > 1))
                  .SelectMany(x => x);
  • 按输出分组以获得一系列相关项目Output

  • 用于SelectMany扁平化按输入分组的结果,其中有重复项

  • 用于SelectMany展平为单个IEnumerable<Data>

否则,如果您只想知道是否有基于上述标准的重复项,那么您可以使用Any

var anyDuplicates = uData.GroupBy(l => l.Ouput)
                         .Any(g => g.GroupBy(x => x.Input).Any(x => x.Count() > 1));


查看完整回答
反对 回复 2022-06-12
?
慕容3067478

TA贡献1773条经验 获得超3个赞

如果我正确理解您的问题,您不想搜索特定输出,而是查找所有重复的输出和输入值。您可以通过对组合进行分组并过滤具有多个条目的组来做到这一点:

var duplicates = uData.GroupBy(d=>new{d.Input,d.Output}).Where(g=>g.Count() > 1)

对于您的示例,上面返回(可枚举)一个组,其键为 {Output: "Output1", Input: "7,8}。(该组本身包含具有该组合的所有元素)


查看完整回答
反对 回复 2022-06-12
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

您可以使用查找,这将创建一个对象,您可以使用您指定的键进行迭代:


public class Program

{

    public static void Main(string[] args)

    {

        List<data> myList = new List<data>();

        myList.Add(new data("output1", "1,5"));

        myList.Add(new data("output2", "1,6"));

        myList.Add(new data("output1", "1,5"));

        myList.Add(new data("output1", "2,0"));


        ILookup<string, string> myLookup = myList.ToLookup(d => d.output, d => d.input);


        foreach (IGrouping<string, string> items in myLookup)

        {

            Console.WriteLine("Output : " + items.Key);

            foreach (string input in items)

            {

                Console.WriteLine("-- Input value is " + input);

            }

        }

    }

}


public class data

{

    public string output;

    public string input;


    public data(string output, string input)

    {

        this.output = output;

        this.input = input;

    }

}

输出将如下所示:


输出 : output1

-- 输入值为 1,5

-- 输入值为 1,5

-- 输入值为 2,0

输出 : output2

-- 输入值为 1,6


然后您可以检查任何两个输入值是否相同。


查看完整回答
反对 回复 2022-06-12
  • 3 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信