【问题标题】:How to get ONLY unique values from list C#如何从列表 C# 中仅获取唯一值
【发布时间】:2021-02-15 14:29:01
【问题描述】:

例如,我有一个 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("Val")、Cell("Hez")),因此 Distinct() 不适合我。

我找到了这个解决方案,但它根本不返回任何数据

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

我认为问题在于 Cell 对象不包含任何比较方法(这是 IronXl lib),所以这就是我在这里使用 ToString() 的原因。

但我还不太了解 linq,因此感谢任何解释或建议

备注:

我需要返回一个单元格列表,但具有唯一值

【问题讨论】:

  • group.Count() == 1 是的,您需要实现 EqualsGetHashCode。另一种选择是使用带有自定义比较器的HashSet,循环列表并检查哈希集
  • 为什么Hez 不是唯一的单元格?
  • @Pavel Anikhouski 修复了它,但这不是重点
  • @Damien_The_Unbeliever 是 :) 我的错误
  • 如果Cell只有值,为什么不使用GroupBy(cell =&gt; cell.Value)呢? GroupBy 也可以接受自定义的IEqualityComparer

标签: c# list linq


【解决方案1】:

第 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

【讨论】:

  • 这是迄今为止最简单的解决方案,如果对您来说足够了,请使用它!但如果您经常必须对Cell 对象进行分组或比较,您可以实现自定义IEqualityComparer&lt;Cell&gt;。见stackoverflow.com/a/60714143
【解决方案2】:

这应该很容易。

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

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

【讨论】:

    【解决方案3】:

    如果我理解正确,但我不确定是否正确,您可以使用.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

    【讨论】:

      【解决方案4】:

      如果你的单元格是这样的。

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

      在这种情况下,只会添加第一个包含“方法”和“4”的单元格。这 '!' '.any' 是必不可少的部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        • 2022-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多