c# - 根据其中一个字段中的子字符串对对象列表进行分组

标签 c# .net linq list substring

我知道这个问题已经被问过了 Using LINQ to group a list of strings based on known substrings that they will contain

但我有一个不同的问题。

我的代码有一个对象列表

public class Description
{
    public Description();

    public string Desc1 { get; set; }
    public string Desc2 { get; set; }
    public string Desc3 { get; set; }
    public DayMonthYear OriginalDate { get; set; }
    public DayMonthYear PostedDate { get; set; }
}

我有这些对象的列表,Desc 3 中有一个 card# 子字符串。 (仅针对某些对象)并非所有这些对象都有卡号。

我有一个包含描述对象列表的结果对象。我可以像这样使用 linq 轻松获得带有卡片 # 的描述列表。

List<Description> CardDescriptions = results.Description.Where(x => x.Desc3.Contains("CARD#")).ToList();

但是下一部分是,desc 3字段在card#之后还有card#(四位数字)。这些可能是不同的卡片 # ,可能有一张或多张。

我正在这样检索

List<String> cardsList = new List<String>();
string[] stringSeparators = new string[] { "CARD#" };

foreach (Description d in CardTrans)
{
    if (d.Desc3.Contains("CARD#"))
    {

        string[] text = d.Desc3.Split(stringSeparators, StringSplitOptions.None);
        if (!(cardsList.Contains(text[1])))
            cardsList.Add(text[1]);
    }
}

在 linq 中有没有一种方法可以获取 card# 列表及其关联列表?

是这样的吗?

List<Tuple<string, List<Description>>>

字符串将是卡片# 和我可以关联的描述对象列表?

我现在需要的是如何获取 String card id 的列表以及与该卡片关联的整个列表,这意味着 Linq 必须以某种方式根据 card ID 之后的子字符串对这些对象进行分组

例如

Desc 3 : test test test Card#1234
Desc 3 : dsd dsftest Card#1234
Desc 3 : jjjjj iiiiii kkkk Card# 1234

应该都在“1234”下,描述对象列表

Desc 3 : ujeuejduejtest test Card#9999
Desc 3 : 2323fseff dsftest Card#9999
Desc 3 : sdfsd fsdsdf kkkk Card#9999

应该都在“9999”下,描述对象列表

Linq 可以做到这一点吗?或者我应该做一个 foreach 循环并在 card# 有不同的子串时添加新的元组吗?

最佳答案

    List<String> cardsList = new List<String>();
    string[] stringSeparators = new string[] { "CARD#" };

    foreach (Description d in CardTrans)
    {
        if (d.Desc3.Contains("CARD#"))
        {

            string[] text = d.Desc3.Split(stringSeparators, StringSplitOptions.None);
            if (!(cardsList.Contains(text[1])))
                cardsList.Add(text[1]);
        }
    }

可以这样改写:

var cardsList=CardTrans
  .Where(ct=>ct.Desc3.Contains("CARD#"))
  .Select(ct=>ct.Desc3.Split(stringSeparators,StringSplitOptions.None)[1])
  .Disinct();

如果你想把它们分组,那么:

var cardsList=CardTrans
  .Where(ct=>ct.Desc3.Contains("CARD#"))
  .GroupBy(key=>key.Desc3.Split(stringSeparators,StringSplitOptions.None)[1]);

这将导致 IGrouping<string,Description> .如果你想要一个元组,我想这样做就可以了:

var cardsList=CardTrans
  .Where(ct=>ct.Desc3.Contains("CARD#"))
  .GroupBy(key=>key.Desc3.Split(stringSeparators,StringSplitOptions.None)[1])
  .Select(x=>Tuple.Create<string,IEnumerable<Description>>(x.Key,x));

测试:

public class Program
{
   public static void Main(string[] args)
   {
        string[] stringSeparators = new string[] { "CARD#" };
       var CardTrans = new List<Description>()
       {
           new Description(){Desc3="test test test CARD#1234"},
           new Description(){Desc3="dsd dsftest CARD#1234"},
           new Description(){Desc3="jjjjj iiiiii kkkk CARD#1234"},
           new Description(){Desc3="ujeuejduejtest test CARD#9999"},
           new Description(){Desc3="2323fseff dsftest CARD#9999"},
           new Description(){Desc3="sdfsd fsdsdf kkkk CARD#9999"}
       };

        var cardsList=CardTrans
            .Where(ct=>ct.Desc3.Contains("CARD#"))
            .GroupBy(key=>key.Desc3.Split(stringSeparators,StringSplitOptions.None)[1])
            .Select(x=>Tuple.Create<string,IEnumerable<Description>>(x.Key,x));
        cardsList.Dump();
   }
}

public class Description
{
   public Description(){}

   public string Desc1 { get; set; }
   public string Desc2 { get; set; }
   public string Desc3 { get; set; }
   public DayMonthYear OriginalDate { get; set; }
   public DayMonthYear PostedDate { get; set; }
}

public class DayMonthYear{}

输出:

enter image description here

关于c# - 根据其中一个字段中的子字符串对对象列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33284724/

相关文章:

c# - 文本框的实时绑定(bind)属性更改

c# - 你如何获得一天中的当前时间?

javascript - 使用 [FromForm] 属性时集合始终为 null

.net - 为什么添加对面向 .NET Framework 4.0 的项目的引用失败?

c# - ObjectDataSource、CustomValidators 和 DataBinding

c# - 在 DataGridViewComboboxColumn 上设置选定项

c# - 微软图形 SDK : Adding Parameters to CalendarView

c# - 如何使用 LINQ 获取日期范围内的平均值

c# - Linq to SQL - 忽略为空或零的搜索参数

c# - Linq to SQL insert with primary key as tinyint set to auto-increment 给出错误消息