我在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();
但是我不会事先知道所有输出以进行检查。
是否有任何入门资料?
答案 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 });
此查询未经测试,但可以为您提供解决方案的想法。