gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:51:52 24 4
gpt4 key购买 nike

我知道这个问题已经被问过了 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com