C#查询列表中的键值并找到重复的

时间:2018-12-12 14:56:56

标签: c#

我在c#中有一个列表为:

List<Data> uData = new List<uData>();

从UI填充uData的位置:

{
   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具有重复的Input,而Output2和Output3没有。

我可以像下面那样首先找到输出,然后检查值:

var myList = uData.Where(p => p.Output == "Output").First();

但是我不会事先知道所有输出以进行检查。

是否有任何入门资料?

6 个答案:

答案 0 :(得分:1)

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

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

以您的示例为例,以上代码返回了一个(可枚举的)组,其键为{输出:“ Output1”,输入:“ 7,8}。 (组本身包含具有该组合的所有元素)

答案 1 :(得分:1)

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

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));

答案 2 :(得分:0)

尝试使用 GroupBy

var myList = uData.Where(p => p.Output == "Output").GroupBy(l => l.Input);

因此您可以获得此列表,该列表按输入排序并遍历每个列表。保存第一个输入,并将其与第二个元素进行比较。如果它们匹配,请按照自己的意愿进行操作,或者使用下一个输入更新变量并进行比较,直到不再匹配为止。

答案 3 :(得分:0)

使用Linq:

   var dups = uData.GroupBy(g => g).Where(group => group.Count() > 1).Select(group => 
   group.Key).Select(out => out.Output == "Output").ToList();

答案 4 :(得分:0)

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

Cloud Firestore API Calls

输出看起来像:

  

输出:output1
  -输入值为1,5
  -输入值为1,5
  -输入值为2,0
  输出:output2
  -输入值为1,6

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

答案 5 :(得分:0)

您可以按Output分组,并选择Input词典的数量少于该组数量的那些组。

 uData.GroupBy(g => g.Output)
     .Where(group => group.Value
                          .Select(x => x.Input)
                          .ToDictionary(y => y).Count() != 
            group.Value.Count())
     .Select(duplicateGroups => new { Output = duplicateGroups.Key });

此查询未经测试,但可以为您提供解决方案的想法。