linq 如何从列表中获取唯一值C#

z0qdvdin  于 2023-11-14  发布在  C#
关注(0)|答案(4)|浏览(165)

例如,我有一个Excel单元格列表

List<Cell> cells = new List<Cell>
{
   new Cell("4"),
   new Cell("Hez"),
   new Cell("Method"),
   new Cell("4"),
   new Cell("Val"),
   new Cell("Method"),
}

字符串
我需要得到唯一的单元格(在本例中是Cell(“瓦尔”),Cell(“Hez”)),所以Distinct()不适合我。
我找到了这个解决方案,但它根本不返回任何数据

var uniqueTest = allData.GroupBy(cell => cell)
                        .Where(group => group.ToString().Count() == 1)
                        .Select(group => group.Key);


我认为问题是Cell对象不包含任何比较方法(这是IronXl库),所以这就是我在这里使用ToString()的原因。
但是我还不太理解LINQ,所以任何解释或建议都很感激。
备注:
我需要得到一个单元格的列表,但是要有唯一的值。

e4yzc0pl

e4yzc0pl1#

步骤1:按值对单元格进行分组。
步骤2:只保留大小为1的组。
步骤3:从每组中取出唯一的物品。

var uniqueCells =
    allData.GroupBy(cell => cell.Value) //Step 1
    .Where(g => g.Count() == 1) //Step 2
    .Select(g => g.Single()) //Step 3

字符串

z3yyvxxp

z3yyvxxp2#

这应该很简单
让我们计算数字4的值是键..那么你的linq应该是这样的

var uniqueTest = allData.GroupBy(x=> x.Key).Select(x=> x.First()).Select(x=> x.Key);

字符串

lkaoscv7

lkaoscv73#

如果我理解正确(我不确定我是否理解正确),您可以使用.First()或更健壮的.Single()

var uniqueTest = allData.First(c => c.ToString() == "Val");

字符串
在这个例子中,我假设c.ToString()将给予单元格的值。否则它可能是类似c.Value或其他的值。
OrDefault的变体有很多种。查看这篇文章了解它们的区别; https://www.c-sharpcorner.com/blogs/singleordefault-vs-firstordefault-in-linq-query1

jslywgbw

jslywgbw4#

如果你把Cell这样分类的话

public class Cell
    {
        public Cell(string mystring)
        {
            MyString = mystring;
        }
        public string MyString { get; set; }

字符串
这将得到一个唯一的列表:

List<Cell> UniqueCells = new List<Cell>();

        foreach (var cell in cells)
        {
            if(!UniqueCells.Any(c=>c.MyString == cell.MyString))
            {
                UniqueCells.Add(cell);
            }
        }


在这种情况下,只会添加第一个包含“Method”和“4”的单元格。“!”和“.Any”是基本部分。

相关问题